Vraptor - Upload

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 ! :smiley:

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 :smiley: :smiley:

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