troca o new PrintWriter(destino) por new FileOutputStream(destino)
Funcionou.
Seguindo sua idéia meu metodo ficou assim:
if(arquivo == null) {
System.out.println("Erro upload");
}
else
{ File destino = new File("c:\\repositorio\\"+arquivo.getFileName());
destino.createNewFile();
InputStream stream = arquivo.getFile();
IOUtils.copy(stream,new FileOutputStream(destino));
System.out.println("Upload Finish");
}
result.include("variable",arquivo.getFileName());
Obrigado pela ajuda.
Lucas Cavalcanti ,
AJUDOU MAIS UM !
Eu estava com problemas para transferencia com os exemplos nas documentacoes do Vraptor
public void upload(UploadedFile arquivo){
String diretorioUpload = "C:\\@UploadsVraptor";
File destinoArquivo = new File(diretorioUpload, arquivo.getFileName());
try {
IOUtils.copy(arquivo.getFile(), new PrintWriter(destinoArquivo));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
result.redirectTo(IndexController.class).index();
}
IOUtils.copy(arquivo.getFile(), new PrintWriter(destinoArquivo));
Troquei o trecho em negrito pelo trecho abaixo, como você sugeriu, e funcionou PERFEITAMENTE.
Solicito revisão nas documentações e testes nos codigos documentados.
Obrigado!
já corrigi na documentação… mais algum erro que vc tenha percebido?
Valeu =)
:shock: Só faltou dar duas chibatadas :shock:
Garcia, nao quis se grosso nao!
É que eu conheco a galera desde 2004, então, tem aquela intimidade…rs
[quote=Alexandre Ferreira]Garcia, nao quis se grosso nao!
É que eu conheco a galera desde 2004, então, tem aquela intimidade…rs[/quote]
Ahh, mas então desculpe-me
Aqui a imagem não está indo para a minha pasta fotos, vejam o erro:
exception
javax.servlet.ServletException: Filter execution threw an exception
root cause
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:196)
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:358)
org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:84)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
root cause
java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:196)
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:358)
org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:84)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
Meu método de upload que está na classe FilmeController:
public void upload(UploadedFile arquivo){
String diretorioUpload = "/home/bruno/fotos";
File destinoArquivo = new File(diretorioUpload, arquivo.getFileName());
try {
IOUtils.copyLarge(arquivo.getFile(), new FileOutputStream(destinoArquivo));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
result.redirectTo(FilmeController.class).lista();
}
Na JSP o form está assim:
<form action="<c:url value="filme/upload"/>" enctype="multipart/form-data" method="post">
<input type="file" name="arquivo" /> <br />
<input type="submit" name="submit" value="Enviar" />
</form>
Criei uma pasta fotos na minha Home, não está certo?
Valeu!
Tudo fica mais claro quando você lê a mensagem de erro ao invés de tentar adivinhar qual a solução.
Note que em sua mensagem há uma mensagem de classe não encontrada: NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
Basta você adicionar o jar do commons-upload que está no diretório de libs do vraptor.
Abraços
nesse caso é a commons-io: org/apache/commons/io/
oops :oops:
Obrigado pelo alerta! =)
Consegui mandar a imagem numa boa.
Abraço!
Desculpem subir o tópico, mas não estou conseguindo salvar o caminho da imagem no banco para depois obtê-la e mostrá-la na jsp.
Eu sei o que quero fazer, mas não sei como.
Tenho minha classe modelo Filme:
//outros métodos
private String urlImagem;
public String getUrlImagem() {
return urlImagem;
}
public void setUrlImagem(String urlImagem) {
this.urlImagem = urlImagem;
}
//outros getters e setters
No meu controller adicionei a parte de upload junto com o método adiciona:
public void adiciona(final Filme filme, UploadedFile arquivo) {
String diretorioUpload = "/home/bruno/fotos";
File destinoArquivo = new File(diretorioUpload, arquivo.getFileName());
try {
IOUtils.copyLarge(arquivo.getFile(), new FileOutputStream(destinoArquivo));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//gravando o Filme no banco
filmeDao.adiciona(filme);
//Retornando mensagem de sucesso na inclusão
result.include("mensagem", "Filme adicionado com sucesso");
//redirecionamento para a lista após a inclusao
result.use(Results.logic()).redirectTo(FilmeController.class).lista();
No formulário JSP está assim:
<form id="" class="" action="filme/adiciona" method="post" enctype="multipart/form-data" >
//outros campos
<li><input type="file" name="arquivo" /></li>
<input type="submit" name="submit" value="Enviar" />
Beleza, a imagem vai para a pasta alvo, mas como faço para que no formulário o usuário possa alterar o nome da imagem e que ao enviar fique com a ID do filme?
Pq dessa forma, com a ID do filme, poderia mostrar o filme na tabela junto com sua imagem ou imagens no caso de uma galeria.
Tava pensando em criar uma tabela no banco e uma classe chamadas Imagem, só para armazenar isso, pois se eu quiser criar uma galeria de imagens, seriam várias imagens para um Filme, relacionamento de um para muitos (1.*), um filme com várias imagens, e uma imagem que pertence a um filme.
obs: a ID do filme é autoincremento no banco.
Alguém poderia me ajudar?
Abraço!!
vc quer dar um nome pra foto só?
acho que criar uma entidade Imagem com nome e caminho real é o suficiente… daí qdo vc salvar, vc salva baseado em um ID auto increment, mas o usuário pode dar o nome que quiser…
daí um filme tem uma ou mais imagens, dependendo do que fizer sentido
Oi lucas!
Obrigado pela dica, mas baixei a apostila mais nova do curso FJ-28 e lá têm a parte de download e upload. Estou seguindo os passos e esbarrei com dois métodos que não existem:
public void upload(Imovel imovel, final UploadedFile imagem) {
validator.checking(new Validations() {{
if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
}
}});
validator.onErrorUse(Results.page()).of(ImovelController.class).edita(imovel.getIdImovel());
imagens.salva(imagem, imovel);
result.redirectTo(ImovelController.class).edita(imovel.getIdImovel());
}
Um é o notNullValue() e o outro o startsWith(“image”).
Estou na página 125 da apostila.
Sabe qual é o método correto para essa validação de imagens?
Abraço!
isso vem de um import estático em org.hamcrest.Matchers.* ou é só um código de exemplo, só pra ilustrar que dá pra fazer isso…
Beleza, parece que esse não é o problema mais urgente, pq a imagem não está subindo =/ , e eu tb não entendi esta anotação:
Na classe ImagensController
@Post
@Path("/imovel/{imovel.idImovel}/imagem")
public void upload(Imovel imovel, final UploadedFile imagem) {
Na classe Imagens:
@Component
public class Imagens {
private File pastaImagens;
public Imagens(ServletContext context) {
String caminhoImagens = context.getRealPath("/home/bruno/fotos");
pastaImagens = new File(caminhoImagens);
pastaImagens.mkdir();
}
Que Path é este aqui?
@Path("/imovel/{imovel.idImovel}/imagem")
Já defini que seria pasta “fotos”, não entendi esse caminho ai… =/
@Path("/imovel/{imovel.idImovel}/imagem")
isso significa que vc vai acessar a lógica upload por uma URL parecida com:
http://localhost:8080/contextoDaApp/imovel/34/imagem
e a imagem seria salva no imovel de id 34
Entendi, o estranho é que tô preenchendo o form, adicionando a imagem e não aparece nada na pasta “fotos”, e no console devolve erro:
00:23:40,716 DEBUG [MultipartItemsProcessor] Uploaded file: imagem with [uploadedFile uploadedCompleteName=252(8).jpg uploadedName=252(8).jpg contentType=image/jpeg]
00:23:40,794 DEBUG [OgnlParametersProvider] Applying imagem with [252(8).jpg]
00:23:40,795 DEBUG [OgnlParametersProvider] cant find property for expression imagem ignoring
00:30:25,696 DEBUG [DefaultResourceTranslator] trying to access /imovel/60/imagem
00:30:25,696 DEBUG [VRaptor ] VRaptor ended the request
Não está achando no form o parâmetro “imagem”:
<form id="" class="" action="imovel/adiciona" method="post" <c:url value="/imovel/${imovel.idImovel }/imagem"/> enctype="multipart/form-data" >
//outros campos
<input type="file" name="imagem" />
<input type="submit" name="submit" value="Enviar" />
Estranho não? O.o
Fiz algumas correções, a JSP de listar quase mostra as imagens, só ameaça e some, e no console mostra esta saida de erro:
01:22:43,534 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
01:22:43,534 DEBUG [ExecuteMethodInterceptor] Invoking ImagensController.download(Imovel)
01:22:43,539 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor OutjectResult
01:22:43,539 DEBUG [OutjectResult ] outjecting file=/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Imobiliaria/home/bruno/fotos/50.imagem
01:22:43,542 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor DownloadInterceptor
01:22:43,543 DEBUG [DownloadInterceptor ] Sending a file to the client
05/04/2010 01:22:43 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.IllegalArgumentException: java.io.FileNotFoundException: /home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Imobiliaria/home/bruno/fotos/50.imagem (No such file or directory)
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.imobiliaria.interceptor.LoginFuncionarioInterceptor.intercept(LoginFuncionarioInterceptor.java:31)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalArgumentException: java.io.FileNotFoundException: /home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Imobiliaria/home/bruno/fotos/50.imagem (No such file or directory)
at br.com.caelum.vraptor.interceptor.download.FileDownload.<init>(FileDownload.java:45)
at br.com.caelum.vraptor.interceptor.download.FileDownload.<init>(FileDownload.java:37)
at br.com.caelum.vraptor.interceptor.download.DownloadInterceptor.intercept(DownloadInterceptor.java:85)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.OutjectResult.intercept(OutjectResult.java:65)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:75)
... 40 more
Caused by: java.io.FileNotFoundException: /home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Imobiliaria/home/bruno/fotos/50.imagem (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at br.com.caelum.vraptor.interceptor.download.FileDownload.<init>(FileDownload.java:42)
... 48 more