Upload Imagem Vraptor 2

Olá pessoal,

meu cenário é o seguinte,
preciso prover upload de imagens,
o sistema utiliza o vraptor 2

alguém tem algum exemplo ou alguma fonte que possa me passar para carregar a imagem para minha camada de controle?

busquei informações na pagina do vraptor
http://vraptor.caelum.com.br/vraptor2.jsp

porém a página da documentação do vraptor2 está bugada…
(concatena a chamada para o index infinitamente…)

Até mais!
:wink:

Se puder, migre para o vraptor 3, o vraptor 2 já parou de ser desenvolvido há 3 anos,

senão, a doc foi perdida =/
mas existe no internet archive:

http://web.archive.org/web/20090605102216/http://www.vraptor.org/

[]'s

Bom dia estava lendo um outro topico sobre upload de arquivos , eu segui passo a passo mas minha aplicação ainda não funciona
, esta com a seguinte mensagem

####################### Fechando Sessão do hibernate… #######################
09/07/2012 12:18:30 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/Apostila_FJ-28] threw exception
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.NullPointerException
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.multipart.Servlet3MultipartInterceptor.intercept(Servlet3MultipartInterceptor.java:151)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
at br.com.caelum.goodbuy.imagens.Imagens.salva(Imagens.java:31)
at br.com.caelum.goodbuy.controller.ImagensController.upload(ImagensController.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
… 44 more

Alguem poderia me dar um auxilio por gentileza?Vlw

Caused by: java.lang.NullPointerException
at br.com.caelum.goodbuy.imagens.Imagens.salva(Imagens.java:31)

null pointer nessa linha.

se é um null pointer pq o UploadedFile veio null, provavelmente foi um erro de conversão (por exemplo arquivo mto grande)

coloque na primeira linha do método:

validator.onErrorRedirectTo(this).formularioDeUpload();

ou algo parecido com isso, ou cheque se o uploadedFile é null antes de fazer qqer coisa.

Puxa que sorte, é vc mesmo que eu queria falar, vi que foi vc que resolveu os outros topicos , antes de tudo muito obrigado vc vai salvar meu emprego cara rs

Seguinte minha classe imagens esta assim:

/*Componente do VRaptor que será responsável

  • por guardar as imagens no servidor.
  • Esse componente vai criar uma pasta fixa onde todas as imagens serão guardadas.*/
    package br.com.caelum.goodbuy.imagens;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.IOUtils;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class Imagens {
private File pastaImagens;

public Imagens(ServletContext context) {
	//String caminhoImagens = context.getRealPath("C:/Imagens");
	pastaImagens = new File("C:/imagens");
	pastaImagens.mkdir();
}

public void salva(UploadedFile imagem, Produto produto) throws IOException {  
    File destino = new File(pastaImagens, produto.getId() + ".jpg");      
  
    try {  	    	
    	 destino.createNewFile();
    	 IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
        
    } catch (FileNotFoundException e) {  
        e.printStackTrace();  
        throw new FileNotFoundException("Arquivo não encontrado!");  
    } catch (IOException e) {  
        e.printStackTrace();  
        throw new IOException("Não foi possivel enviar o arquivo!");  
    }  
      
    System.out.println("Teste para saber se passa por aki!!!");  
    imagem.getFile().close();  
      
  
}  

public File mostra(Produto produto) {
	File file = new File(pastaImagens,produto.getId()+".jpg" );
	return (file.exists()) ? file : new File(pastaImagens+"/default.jpg");
}

}
antes de postar o restante como eu faço pra postar como codigo sou novo aki no GUJ desculpa ae!?

vc posta entre e

como eu disse, coloque a linha do validator no método br.com.caelum.goodbuy.controller.ImagensController.upload(ImagensController.java:40)

A o uploadfile esta null sim!!

poe a linha do validator então :wink:

Então minha classe de controller esta assim
[code
/*

  • Controller que vai tratar dos uploads e downloads de imagens
  • */
    package br.com.caelum.goodbuy.controller;
    import java.io.File;
    import java.io.IOException;

import br.com.caelum.goodbuy.imagens.Imagens;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.validator.Validations;
import static org.hamcrest.Matchers.*;

import static br.com.caelum.vraptor.view.Results.*;

@Resource
public class ImagensController {

private final Validator validator;
private final Imagens imagens;
private final Result result;

public ImagensController(Validator validator, Imagens imagens, Result result) {
	this.validator = validator;
	this.imagens = imagens;
	this.result = result;
}

@Post @Path("/produtos/{produto.id}/imagem")
public void upload(Produto produto, final UploadedFile imagem) throws IOException {
	validator.checking(new Validations() {{
			if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
				that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
			}
}});
	validator.onErrorRedirectTo(ProdutosController.class).edita(produto.getId());
	imagens.salva(imagem, produto);
	result.redirectTo(ProdutosController.class).edita(produto.getId());
}

@Get @Path("/produtos/{produto.id}/imagem")
public File download(Produto produto) {
	return imagens.mostra(produto);
}

}

][/code]

fiz exatamente como esta na apostila e agora esta caindo a mensagem que

imagem - Invalid upload
imagem - Digite uma imagem

que esta no messages.properties

No console num aparece mais erro nenhum

Cara estranho eu coloquei assim [code] codigo [/code ] e apareceu do mesmo jeito?

coloque o código entre e

pra saber o que aconteceu, habilite o log de debug do vraptor

não pode ter espaço dentro da tag.

Putz ja vi o que fiz de errado! desculpa ae!! :oops:

Lucas seguinte cara

Esse é meu form...
<form action="<c:url value="/produtos/${produto.id}/imagem"/>" method="Post">  
	    <fieldset>  
	        <legend>Editar Produto</legend>  
	          
	        <label for ="nome">Nome:</label>  
	        <input id="nome" type="text" name="produto.nome" value="${produto.nome}" />  
	          
	        <label for ="descicao">Descricao:</label>  
	        <textarea id ="descricao" name="produto.descricao">${produto.descricao}</textarea>  
	          
	        <label for ="preco">Preco:</label>  
	        <input id="preco" type="text" name="produto.preco" value="${produto.preco}" />  
	        	      
		    <button type="submit" name="_method" value="PUT">Alterar</button>  
		</fieldset>  
	</form>  
    
    <form action="<c:url value="/produtos/${produto.id }/imagem"/>" method="POST" enctype="multipart/form-data">
		<fieldset>
			<legend>Upload de Imagem</legend>
			<input type="file" name="imagem" />
			<button type="submit">Enviar</button>
		</fieldset>
	</form>

 esse é o Controller
/*
 * Controller que vai tratar dos uploads e downloads de imagens
 * */
package br.com.caelum.goodbuy.controller;
import java.io.File;  
import java.io.IOException;  
  
import br.com.caelum.goodbuy.imagens.Imagens;  
import br.com.caelum.goodbuy.modelo.Produto;  
import br.com.caelum.vraptor.Get;  
import br.com.caelum.vraptor.Path;  
import br.com.caelum.vraptor.Post;  
import br.com.caelum.vraptor.Resource;  
import br.com.caelum.vraptor.Result;  
import br.com.caelum.vraptor.Validator;  
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;  
import br.com.caelum.vraptor.validator.Validations;  
import static org.hamcrest.Matchers.*;  
  
import static br.com.caelum.vraptor.view.Results.*;  

@Resource
public class ImagensController {
	
	private final Validator validator;
	private final Imagens imagens;
	private final Result result;
	
	public ImagensController(Validator validator, Imagens imagens, Result result) {
		this.validator = validator;
		this.imagens = imagens;
		this.result = result;
	}
	
	@Post @Path("/produtos/{produto.id}/imagem")
	public void upload(Produto produto, final UploadedFile imagem) throws IOException {
		
		validator.onErrorRedirectTo(ProdutosController.class).edita(produto.getId());
		imagens.salva(imagem, produto);
		result.redirectTo(ProdutosController.class).edita(produto.getId());
	}
	
	@Get @Path("/produtos/{produto.id}/imagem")
	public File download(Produto produto) {
		return imagens.mostra(produto);
	}
}

/*Componente do VRaptor que será responsável
 *  por guardar as imagens no servidor.
 *  Esse componente vai criar uma pasta fixa onde todas as imagens serão guardadas.*/
package br.com.caelum.goodbuy.imagens;

import java.io.File;  
import java.io.FileNotFoundException;
import java.io.FileOutputStream;  
import java.io.IOException;    
import javax.servlet.ServletContext;    
import org.apache.commons.io.IOUtils;    
import br.com.caelum.goodbuy.modelo.Produto;  
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;  
import br.com.caelum.vraptor.ioc.Component;  

@Component
public class Imagens {
	private File pastaImagens;
	
	public Imagens(ServletContext context) {
		//String caminhoImagens = context.getRealPath("C:/Imagens");
		pastaImagens = new File("C:/imagens");
		pastaImagens.mkdir();
	}
	
	public void salva(UploadedFile imagem, Produto produto) throws IOException {  
	    File destino = new File(pastaImagens, produto.getId() + ".jpg");      
	  
	    try {  	    	
	    	 destino.createNewFile();
	    	 IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
	        
	    } catch (FileNotFoundException e) {  
	        e.printStackTrace();  
	        throw new FileNotFoundException("Arquivo não encontrado!");  
	    } catch (IOException e) {  
	        e.printStackTrace();  
	        throw new IOException("Não foi possivel enviar o arquivo!");  
	    }  
	      
	    System.out.println("Teste para saber se passa por aki!!!");  
	    imagem.getFile().close();  
	      
	  
	}  

	public File mostra(Produto produto) {
		File file = new File(pastaImagens,produto.getId()+".jpg" );
		return (file.exists()) ? file : new File(pastaImagens+"/default.jpg");
	}
}

[img]

[/img]

Vixi a imagem num foi mas ainda esta vindo null?

Coloquei uma imagem default na minha pasta ele localiza a imagem !! so que o upload num faz de jeito nenhum seleciono o arquivo e nada!

ok, a imagem que vc tá fazendo upload é grande? tipo maior que 2MB?

vc está com a lib commons-fileupload no classpath?

A imagem tem 7,16 KB , qto lib vou colocar …! so um minuto

Ainda esta aparecendo " imagem - invalid upload"?

habilite o log de debug do vraptor e veja o que aparece na requisição:

coloque esse arquivo no classpath e mude o pacote do vraptor de INFO pra DEBUG