Ajuda com Upload e download de imagens no vraptor

Estou com um erro de nullpointer, no entanto já debuguei o código todo, dei vários prints e ele imprimi tudo certinho mas não consigo achar o erro. Tenho um form que ao dar um submit ele envia os dados para uma view. Mas a imagem não aparece. Se alguém puder me ajudar eu agradeço…
Segue o erro

VersaoController

@Get
	@Path("/versao/visualiza/foto")
	public File downloadFoto(VersaoImagem foto) {
		//System.out.println("down controller: "+foto.getFoto());
		return business.downloadFoto(foto);
	}
	
	@Path("/versao/visualiza")
	public void visualiza(String vigencia, String atualizacao, List<String> mun,
			List<String> local, Long[] nivelSel, Versao versao, UploadedFile picture) throws IOException {

		System.out.println("picture: "+picture.getFile()+" - "+picture.getFileName());

		try {
			vi = business.salvarFoto(picture);//faz o upload da foto e retorna um objeto tipo VersaoImagem
			downloadFoto(vi);
			System.out.println("caminho da foto controller: "+vi.getFoto());
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	
		/* Header do Alerta */
		this.result.include("idalerta", dao.retornaSequenceAlerta());
		this.result.include("atualizacao", atualizacao);
		this.result.include("data", fd.getdatahora());
		this.result.include("vigencia", vigencia);
		this.result.include("versao", versao);
		this.result.include("imagem",vi); //envia a "legenda" da imagem pra visualiza.jsp
		//this.result.include(downloadFoto(vi));
		 
		String uf = null;

		System.out.println("Municipios");
		for (String m : mun) {
			System.out.println(m);
		}
		HashMap<Long, MunicipiolLocalidade> hmMunicipioLocalidade = new HashMap<Long, MunicipiolLocalidade>();

		// idMun_idLoc_idNivel_<IdEvt,IdEvt,...>
		for (String m : mun) {
			
			//            0       1       2           3
			// separa em idMun, idLoca, idNivel e idEventos
			String[] munLocNivelEventos = m.split("\\_");
			
			// idMunicipio no indice 0 do array munLocNivelEventos
			Long idMun = Long.parseLong(munLocNivelEventos[0]); 
......

VersaoBusiness

@Component
public class VersaoBusiness {

	private static final String PATH_FOTO = System.getProperty("user.home")	+ "/img";
	VersaoImagem imagem;
	
	public VersaoBusiness(VersaoImagem imagem) {
		this.imagem = imagem;
	}

	public VersaoImagem salvarFoto(UploadedFile picture) throws IOException {

		if (picture != null) {
			System.out.println("pegou a imagem");
			String fileName = picture.getFileName();
			
			String[] getNameImage = fileName.split("\\.");
			String nomeDaImagem = getNameImage[0];
			String extensao = getNameImage[1];

			imagem.setFoto(nomeDaImagem+"."+extensao);
			System.out.println("caminho da foto: " + PATH_FOTO + "/" +imagem.getFoto());

			try {
				IOUtils.copyLarge(picture.getFile(), new FileOutputStream(new File(PATH_FOTO + "/" + imagem.getFoto())));
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				throw new FileNotFoundException("Arquivo não encontrado!");
			} catch (IOException e) {
				e.printStackTrace();
				throw new IOException("Não foi possível enviar o arquivo!");
			}
		}else{
			System.out.println("não pegou a imagem");
		}
		return imagem;
	}
	
	
	public File downloadFoto(VersaoImagem foto) {
		System.out.println("download: "+foto.getFoto());
		return new File(PATH_FOTO + "/" + foto.getFoto());
	}
	
}

novo.jsp

<form name="form" id="form" action="<c:url value="/versao/visualiza"/>" method="post" enctype="multipart/form-data" class="form" style="width: 675px;" >

<fieldset style="margin-bottom: 10px;">
Legenda: <input name="imagem.legenda" type="text" size="60" /><br />
<input type="file" name="picture" size="35" />
</fieldset>
</form>

visualiza.jsp

<div>
	<p>Legenda: ${imagem.legenda} </p>
	<p>
 		<img src="<c:url value="/versao/visualiza/foto"/>" width="90" height="90" border="0"/>
	</p>
</div>

Você tem um método que recebe como parametro a foto:

E como você diz qual a foto usar, se no caminho passado no JSP você tem apenas o PATH sem o ID da foto?

Mágica ainda não funciona :wink:

Faz assim… altera o @Path do método downloadFoto para /versao/visualiza/foto/{foto.id}, e no JSP coloca:

Garcia, obrigado pela ajuda. To viajando nisso.

Fiz dessa forma como você falou…

@Get
	@Path("/versao/visualiza/foto/${vi.foto}")
	public File downloadFoto(VersaoImagem foto) {
		System.out.println("down controller: "+foto.getFoto());
		return business.downloadFoto(foto);
	}
<img src="<c:url value="/versao/visualiza/foto/${imagem.foto}"/>" width="90" height="90" border="0"/>

//Ele gerou um html assim...
<img src="/alerta/versao/visualiza/foto/eu.jpg" width="90" height="90" border="0">

É que nos exemplos que vi na net, nenhum passa id de identificação. Esse ${vi.foto} tem que vir o caminho completo da imagem? Essa imagem tá no disco, não tá no banco, ela ainda não foi cadastrada, a ideia é apenas exibir na view antes de inseri-la no banco

se o parâmetro do método se chama foto, o parâmetro na url tb tem que começar com foto.

@Get("/versao/visualiza/foto/${foto.foto}")  
    public File downloadFoto(VersaoImagem foto) {  

se foto.getFoto() puder conter barras (/) vc precisa colocar um *:

@Get("/versao/visualiza/foto/${foto.foto*}")  

Lucas,

Fiz como você falou

@Get
	@Path("/versao/visualiza/foto/${foto.foto*}")
	public File downloadFoto(VersaoImagem foto) {
		System.out.println("down controller: "+foto.getFoto());
		return business.downloadFoto(foto);
	}
<img src="<c:url value="/versao/visualiza/foto/${imagem.foto}"/>" width="90" height="90" border="0"/>

Não dá erro nenhum, no console, mas não exibe a imagem na view. Aparece como se o caminho estivesse errado. Qnd dou um “inspecionar elemento no chrome” o caminho é

<img src="/alerta/versao/visualiza/foto/" width="90" height="90" border="0">

Esse é meu console!



Informações: Server startup in 5539 ms
11:06:02,875 DEBUG [VRaptor             ] VRaptor received a new request
11:06:03,006 DEBUG [ValidatorFactoryCreator] Initializing JSR303 factory for bean validation
11:06:03,009 DEBUG [JSR303ValidatorFactory] Initializing JSR303 Validator
11:06:03,016 DEBUG [MessageInterpolatorFactory] Initializing JSR303 MessageInterpolator
11:06:03,054 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:03,054 DEBUG [DefaultResourceTranslator] trying to access /versao/novo
11:06:03,058 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: VersaoController.novoVersaoController.novo()]
11:06:03,062 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:06:03,168 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:06:03,174 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:06:03,184 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor AutorizacaoInterceptor
11:06:03,206 DEBUG [DefaultLogicResult  ] redirecting to class LoginController
11:06:03,290 DEBUG [CglibProxifier      ] a proxy for class br.gov.cemaden.controller.LoginController is created as class br.gov.cemaden.controller.LoginController$$EnhancerByCGLIB$$bc07da09
11:06:03,292 DEBUG [DefaultLogicResult  ] redirecting to /alerta/
11:06:03,294 DEBUG [VRaptor             ] VRaptor ended the request
11:06:03,301 DEBUG [VRaptor             ] VRaptor received a new request
11:06:03,313 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:03,313 DEBUG [DefaultResourceTranslator] trying to access /
11:06:03,313 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: LoginController.loginLoginController.login()]
11:06:03,314 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:06:03,325 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:06:03,326 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:06:03,335 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
11:06:03,343 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:06:03,343 DEBUG [ExecuteMethodInterceptor] Invoking LoginController.login()
11:06:03,349 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
11:06:03,349 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
11:06:03,357 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/login/login.jsp
11:06:03,363 DEBUG [DefaultStaticContentHandler] Deferring request to container: /alerta/WEB-INF/jsp/login/login.jsp 
11:06:03,452 DEBUG [VRaptor             ] VRaptor ended the request
11:06:05,286 DEBUG [VRaptor             ] VRaptor received a new request
11:06:05,298 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:05,298 DEBUG [DefaultResourceTranslator] trying to access /
11:06:05,298 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: LoginController.loginLoginController.login(Gerente)]
11:06:05,299 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:06:05,302 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:06:05,303 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:06:05,306 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
11:06:05,355 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
11:06:05,360 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.login(Gerente) as [gerente]
11:06:05,370 DEBUG [OgnlParametersProvider] Applying senha with [123]
11:06:05,390 DEBUG [OgnlParametersProvider] Applying login with [marcos]
11:06:05,390 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: LoginController.loginLoginController.login(Gerente)] are [br.gov.cemaden.bean.Gerente@1266d261]
11:06:05,391 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:06:05,391 DEBUG [ExecuteMethodInterceptor] Invoking LoginController.login(Gerente)
11:06:05,453 DEBUG [CglibProxifier      ] a proxy for interface br.com.caelum.vraptor.view.PageResult is created as class br.com.caelum.vraptor.view.PageResult$$EnhancerByCGLIB$$f77a117c
11:06:05,455 DEBUG [CglibProxifier      ] a proxy for class br.gov.cemaden.controller.LoginController is created as class br.gov.cemaden.controller.LoginController$$EnhancerByCGLIB$$bc07da09
11:06:05,469 DEBUG [DefaultLogicResult  ] redirecting to class IndexController
11:06:05,475 DEBUG [CglibProxifier      ] a proxy for class br.gov.cemaden.controller.IndexController is created as class br.gov.cemaden.controller.IndexController$$EnhancerByCGLIB$$e40bf3a
11:06:05,475 DEBUG [DefaultLogicResult  ] redirecting to /alerta/painel
11:06:05,476 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
11:06:05,476 DEBUG [ForwardToDefaultViewInterceptor] Request already dispatched and commited somewhere else, not forwarding.
11:06:05,503 DEBUG [VRaptor             ] VRaptor ended the request
11:06:05,506 DEBUG [VRaptor             ] VRaptor received a new request
11:06:05,517 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:05,517 DEBUG [DefaultResourceTranslator] trying to access /painel
11:06:05,517 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: IndexController.indexIndexController.index()]
11:06:05,518 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:06:05,522 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:06:05,529 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:06:05,531 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
11:06:05,532 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:06:05,532 DEBUG [ExecuteMethodInterceptor] Invoking IndexController.index()
11:06:05,533 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
11:06:05,533 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
11:06:05,535 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/index/index.jsp
11:06:05,536 DEBUG [DefaultStaticContentHandler] Deferring request to container: /alerta/WEB-INF/jsp/index/index.jsp 
11:06:05,543 DEBUG [VRaptor             ] VRaptor ended the request
11:06:07,598 DEBUG [VRaptor             ] VRaptor received a new request
11:06:07,608 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:07,608 DEBUG [DefaultResourceTranslator] trying to access /versao/novo
11:06:07,609 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: VersaoController.novoVersaoController.novo()]
11:06:07,609 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:06:07,616 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:06:07,617 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:06:07,619 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
11:06:07,620 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:06:07,620 DEBUG [ExecuteMethodInterceptor] Invoking VersaoController.novo()
11:06:07,639 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
11:06:07,639 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
11:06:07,642 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/versao/novo.jsp
11:06:07,643 DEBUG [DefaultStaticContentHandler] Deferring request to container: /alerta/WEB-INF/jsp/versao/novo.jsp 
11:06:07,664 DEBUG [VRaptor             ] VRaptor ended the request
11:06:11,298 DEBUG [VRaptor             ] VRaptor received a new request
11:06:11,308 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:11,309 DEBUG [DefaultResourceTranslator] trying to access /versao/municipios/SP
11:06:11,310 DEBUG [VRaptorRequest      ] Setting municipio.uf with [SP]
11:06:11,310 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: VersaoController.listaMunicipioJSONVersaoController.listaMunicipioJSON(Municipio)]
11:06:11,311 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:06:11,317 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:06:11,318 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:06:11,320 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
11:06:11,324 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
11:06:11,324 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for VersaoController.listaMunicipioJSON(Municipio) as [municipio]
11:06:11,324 DEBUG [OgnlParametersProvider] Applying uf with [SP]
11:06:11,324 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: VersaoController.listaMunicipioJSONVersaoController.listaMunicipioJSON(Municipio)] are [br.gov.cemaden.bean.Municipio@6daab103]
11:06:11,326 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:06:11,326 DEBUG [ExecuteMethodInterceptor] Invoking VersaoController.listaMunicipioJSON(Municipio)
11:06:11,647 DEBUG [XStreamConverters   ] registered Xstream converter forbr.com.caelum.vraptor.validator.MessageConverter
11:06:11,647 DEBUG [XStreamConverters   ] registered Xstream converter forbr.com.caelum.vraptor.serialization.xstream.XStreamConverters$NullConverter
11:06:11,788 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
11:06:11,788 DEBUG [ForwardToDefaultViewInterceptor] Request already dispatched and commited somewhere else, not forwarding.
11:06:11,882 DEBUG [VRaptor             ] VRaptor ended the request
11:06:15,930 DEBUG [VRaptor             ] VRaptor received a new request
11:06:15,940 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:15,940 DEBUG [DefaultResourceTranslator] trying to access /versao/localidades/3058
11:06:15,940 DEBUG [VRaptorRequest      ] Setting municipio.idmunicipio with [3058]
11:06:15,940 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: VersaoController.listaLocalidadeJSONVersaoController.listaLocalidadeJSON(Municipio)]
11:06:15,941 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:06:15,948 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:06:15,949 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:06:15,950 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
11:06:15,954 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
11:06:15,954 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for VersaoController.listaLocalidadeJSON(Municipio) as [municipio]
11:06:15,954 DEBUG [OgnlParametersProvider] Applying idmunicipio with [3058]
11:06:15,958 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: VersaoController.listaLocalidadeJSONVersaoController.listaLocalidadeJSON(Municipio)] are [br.gov.cemaden.bean.Municipio@4b3303af]
11:06:15,959 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:06:15,959 DEBUG [ExecuteMethodInterceptor] Invoking VersaoController.listaLocalidadeJSON(Municipio)
11:06:15,967 DEBUG [XStreamConverters   ] registered Xstream converter forbr.com.caelum.vraptor.validator.MessageConverter
11:06:15,967 DEBUG [XStreamConverters   ] registered Xstream converter forbr.com.caelum.vraptor.serialization.xstream.XStreamConverters$NullConverter
11:06:15,969 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
11:06:15,969 DEBUG [ForwardToDefaultViewInterceptor] Request already dispatched and commited somewhere else, not forwarding.
11:06:15,972 DEBUG [VRaptor             ] VRaptor ended the request
11:06:25,705 DEBUG [VRaptor             ] VRaptor received a new request
11:06:25,715 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor CommonsUploadMultipartInterceptor
11:06:25,715  INFO [CommonsUploadMultipartInterceptor] Request contains multipart data. Try to parse with commons-upload.
11:06:25,717 DEBUG [CommonsUploadMultipartInterceptor] Using repository C:\Program Files (x86)\apache-tomcat-6.0.35\temp for file upload
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] Found 14 attributes in the multipart form submission. Parsing them.
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] alerta.idalerta is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] data is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] versao is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] vigencia is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] municipio.uf is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] municipio.idmunicipio is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] nivelSel[8] is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] mun is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] imagem.legenda is a field
11:06:25,734 DEBUG [CommonsUploadMultipartInterceptor] picture is a file
11:06:25,736 DEBUG [VRaptorRequest      ] Setting picture with [picture]
11:06:25,736 DEBUG [CommonsUploadMultipartInterceptor] Uploaded file: picture with [uploadedFile uploadedCompleteName=eu.jpg uploadedName=eu.jpg contentType=image/jpeg]
11:06:25,736 DEBUG [CommonsUploadMultipartInterceptor] versao.descricao is a field
11:06:25,736 DEBUG [CommonsUploadMultipartInterceptor] versao.observacao is a field
11:06:25,736 DEBUG [CommonsUploadMultipartInterceptor] versao.retroanalise is a field
11:06:25,736 DEBUG [CommonsUploadMultipartInterceptor] versao.discussao is a field
11:06:25,739 DEBUG [VRaptorRequest      ] Setting alerta.idalerta with [1]
11:06:25,739 DEBUG [VRaptorRequest      ] Setting data with [2012-05-09 11:06:07]
11:06:25,739 DEBUG [VRaptorRequest      ] Setting versao with [1]
11:06:25,739 DEBUG [VRaptorRequest      ] Setting vigencia with []
11:06:25,739 DEBUG [VRaptorRequest      ] Setting municipio.uf with [SP]
11:06:25,739 DEBUG [VRaptorRequest      ] Setting municipio.idmunicipio with [0]
11:06:25,739 DEBUG [VRaptorRequest      ] Setting nivelSel[8] with [1]
11:06:25,739 DEBUG [VRaptorRequest      ] Setting mun with [3058_8_1_1,2,3]
11:06:25,739 DEBUG [VRaptorRequest      ] Setting imagem.legenda with [teste]
11:06:25,739 DEBUG [VRaptorRequest      ] Setting versao.descricao with []
11:06:25,739 DEBUG [VRaptorRequest      ] Setting versao.observacao with []
11:06:25,739 DEBUG [VRaptorRequest      ] Setting versao.retroanalise with []
11:06:25,739 DEBUG [VRaptorRequest      ] Setting versao.discussao with []
11:06:25,741 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:25,741 DEBUG [DefaultResourceTranslator] trying to access /versao/visualiza
11:06:25,741 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: VersaoController.visualizaVersaoController.visualiza(String, String, List, List, Long[], Versao, UploadedFile)]
11:06:25,742 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:06:25,748 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:06:25,749 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:06:25,751 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
11:06:25,755 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
11:06:25,755 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for VersaoController.visualiza(String, String, List, List, Long[], Versao, UploadedFile) as [vigencia, atualizacao, mun, local, nivelSel, versao, picture]
11:06:25,758 DEBUG [OgnlParametersProvider] Applying  with []
11:06:25,759 DEBUG [OgnlFacade          ] unable to parse expression ''. Ignoring.
11:06:25,761 DEBUG [OgnlParametersProvider] Applying  with [3058_8_1_1,2,3]
11:06:25,761 DEBUG [OgnlFacade          ] unable to parse expression ''. Ignoring.
11:06:25,761 DEBUG [OgnlParametersProvider] Applying icipio.uf with [SP]
11:06:25,770 DEBUG [OgnlFacade          ] cant find property for expression icipio.uf ignoring
11:06:25,770 DEBUG [OgnlParametersProvider] Applying icipio.idmunicipio with [0]
11:06:25,771 DEBUG [OgnlFacade          ] cant find property for expression icipio.idmunicipio ignoring
11:06:25,771 DEBUG [OgnlParametersProvider] Applying [8] with [1]
11:06:25,772 DEBUG [OgnlParametersProvider] Applying observacao with []
11:06:25,772 DEBUG [OgnlParametersProvider] Applying descricao with []
11:06:25,772 DEBUG [OgnlParametersProvider] Applying retroanalise with []
11:06:25,773 DEBUG [OgnlParametersProvider] Applying  with [1]
11:06:25,773 DEBUG [OgnlFacade          ] unable to parse expression ''. Ignoring.
11:06:25,773 DEBUG [OgnlParametersProvider] Applying discussao with []
11:06:25,773 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: VersaoController.visualizaVersaoController.visualiza(String, String, List, List, Long[], Versao, UploadedFile)] are [, null, [3058_8_1_1,2,3], null, [1], br.gov.cemaden.bean.Versao@589dae25, [uploadedFile uploadedCompleteName=eu.jpg uploadedName=eu.jpg contentType=image/jpeg]]
11:06:25,774 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:06:25,774 DEBUG [ExecuteMethodInterceptor] Invoking VersaoController.visualiza(String, String, List, List, Long[], Versao, UploadedFile)
picture: java.io.FileInputStream@18d6185f - eu.jpg
11:06:25,779 DEBUG [CglibProxifier      ] a proxy for interface br.com.caelum.vraptor.view.PageResult is created as class br.com.caelum.vraptor.view.PageResult$$EnhancerByCGLIB$$f77a117c
11:06:25,790 DEBUG [CglibProxifier      ] a proxy for class br.gov.cemaden.controller.VersaoController is created as class br.gov.cemaden.controller.VersaoController$$EnhancerByCGLIB$$6fb37f50
pegou a imagem
caminho da foto: C:\Users\Administrador/img/eu.jpg
down controller: eu.jpg
download: eu.jpg
caminho da foto controller: eu.jpg
Municipios
3058_8_1_1,2,3
Evento: 1
Evento: 2
Evento: 3
ML: 
Lorena
zona sul
Alto
Deslizamento
chuva
Tempestade


11:06:25,816 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
11:06:25,816 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
11:06:25,818 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/versao/visualiza.jsp
11:06:25,819 DEBUG [DefaultStaticContentHandler] Deferring request to container: /alerta/WEB-INF/jsp/versao/visualiza.jsp 
11:06:26,711 DEBUG [VRaptor             ] VRaptor ended the request
11:06:26,759 DEBUG [VRaptor             ] VRaptor received a new request
11:06:26,773 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:26,773 DEBUG [DefaultResourceTranslator] trying to access /versao/visualiza/foto/eu.jpg
11:06:26,774 DEBUG [VRaptor             ] VRaptor ended the request
11:06:46,730 DEBUG [VRaptor             ] VRaptor received a new request
11:06:46,742 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:06:46,743 DEBUG [DefaultResourceTranslator] trying to access /versao/visualiza/foto/eu.jpg
11:06:46,743 DEBUG [VRaptor             ] VRaptor ended the request

tem algo nessa variável? ${imagem.foto}

deveria ter algo na frente desse /foto/ pra funcionar

tem sim! Ela recebe o nome da foto.

Qnd coloco o visualiza.jsp assim:

<img src="<c:url value="/versao/visualiza/foto/${imagem.foto}"/>" width="90" height="90" border="0"/>

Ele retorna a URL

http://localhost:8080/alerta/versao/visualiza/foto/uba1.jpg

mas não abre a foto

Meu VersaoController completo:

package br.gov.cemaden.controller;

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

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

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.gov.cemaden.bean.Evento;
import br.gov.cemaden.bean.Localidade;
import br.gov.cemaden.bean.Municipio;
import br.gov.cemaden.bean.Nivel;
import br.gov.cemaden.bean.Versao;
import br.gov.cemaden.bean.VersaoImagem;
import br.gov.cemaden.business.VersaoBusiness;
import br.gov.cemaden.dao.AlertaDAO;
import br.gov.cemaden.dao.EventoDAO;
import br.gov.cemaden.dao.LocalidadeDAO;
import br.gov.cemaden.dao.MunicipioDAO;
import br.gov.cemaden.dao.NivelDAO;
import br.gov.cemaden.interceptor.Restrito;
import br.gov.cemaden.util.Combos;
import br.gov.cemaden.util.FormataData;
import br.gov.cemaden.util.Validacao;

@Resource
public class VersaoController {
	
	private final Validator validator;
	private final Result result;
	private final AlertaDAO dao;
	private final MunicipioDAO mdao;
	private final LocalidadeDAO ldao;
	private final NivelDAO ndao;
	private final EventoDAO edao;
	private VersaoBusiness business;
	private VersaoImagem vi;

	Combos combo = new Combos();
	FormataData fd = new FormataData();

	public VersaoController( Validator validator, Result result, AlertaDAO dao, MunicipioDAO mdao, LocalidadeDAO ldao, NivelDAO ndao, EventoDAO edao, VersaoBusiness business, VersaoImagem vi) {
		this.validator = validator;
		this.result = result;
		this.dao = dao;
		this.mdao = mdao;
		this.ldao = ldao;
		this.ndao = ndao;
		this.edao = edao;
		this.business = business;
		this.vi = vi;
	}

	public void carregaMunicipioPorUF(Municipio municipio) {
		List<Municipio> lista = mdao.listaMunicipioPorUF(municipio.getUf());
		this.result.include("listaCidade", lista);
	}

	public void carregaLocalidadePorCidade(Municipio municipio) {
		List<Localidade> lista = ldao.listaLocalidade(municipio.getIdmunicipio());
		this.result.include("listaLocalidade", lista);
	}

	@Restrito
	@Get
	@Path("/versao/novo")
	public void novo() throws Exception {

		this.result.include("idalerta", dao.retornaSequenceAlerta());
		this.result.include("listaUf", combo.estados());
		this.result.include("data", fd.getdatahora());
		this.result.include("listaNivel", ndao.lista());
		this.result.include("listaEvento", edao.lista());

	}

	@Restrito
	@Post
	@Path("/versao/novo")
	public void novo(Municipio municipio) {

		carregaMunicipioPorUF(municipio);

		this.result.include("idalerta", dao.retornaSequenceAlerta());
		this.result.include("listaUf", combo.estados());
		this.result.include("data", fd.getdatahora());
		this.result.include("estado", municipio.getUf());
		this.result.include("id", municipio.getIdmunicipio());

		carregaLocalidadePorCidade(municipio);
		this.result.include("listaNivel", ndao.lista());
		this.result.include("listaEvento", edao.lista());
	}

	@Get
	@Path("/versao/localidades/{municipio.idmunicipio}")
	public void listaLocalidadeJSON(Municipio municipio) {
		List<Localidade> lista = ldao.listaLocalidade(municipio.getIdmunicipio());
		result.use(json()).withoutRoot().from(lista).exclude("contador").serialize();
	}

	@Get
	@Path("/versao/municipios/{municipio.uf}")
	public void listaMunicipioJSON(Municipio municipio) {
		List<Municipio> lista = mdao.listaMunicipioPorUF(municipio.getUf());
		result.use(json()).withoutRoot().from(lista).serialize();
	}

	@Get
	@Path("/versao/visualiza/foto/${foto.foto}")
	public File downloadFoto(VersaoImagem foto) {
		System.out.println("down controller: "+foto.getFoto());
		return business.downloadFoto(foto);
	}
	
	@Path("/versao/visualiza")
	public void visualiza(String vigencia, String atualizacao, List<String> mun,
			List<String> local, Long[] nivelSel, Versao versao, final UploadedFile picture) throws Exception {

		System.out.println("picture: "+picture.getFile()+" - "+picture.getFileName());

		try {
			
			Validacao val = new Validacao(validator);
			val.validaImagem(picture);
			validator.onErrorUsePageOf(this).novo();
			
			vi = business.salvarFoto(picture);//faz o upload da foto e retorna um objeto tipo VersaoImagem
			downloadFoto(vi);
			System.out.println("caminho da foto controller: "+vi.getFoto());
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	
		/* Header do Alerta */
		this.result.include("idalerta", dao.retornaSequenceAlerta());
		this.result.include("atualizacao", atualizacao);
		this.result.include("data", fd.getdatahora());
		this.result.include("vigencia", vigencia);
		this.result.include("versao", versao);
		this.result.include("imagem",vi); //envia a "legenda" da imagem pra visualiza.jsp
		//this.result.include(downloadFoto(vi));
		 
		String uf = null;

		System.out.println("Municipios");
		for (String m : mun) {
			System.out.println(m);
		}
		HashMap<Long, MunicipiolLocalidade> hmMunicipioLocalidade = new HashMap<Long, MunicipiolLocalidade>();

		// idMun_idLoc_idNivel_<IdEvt,IdEvt,...>
		for (String m : mun) {
			
			//            0       1       2           3
			// separa em idMun, idLoca, idNivel e idEventos
			String[] munLocNivelEventos = m.split("\\_");
			
			// idMunicipio no indice 0 do array munLocNivelEventos
			Long idMun = Long.parseLong(munLocNivelEventos[0]); 


			// idMun_idLoc_idNivel_{Eventos}
			if (munLocNivelEventos.length == 4 								// verifica se veio 4 elementos na string mun
					&& munLocNivelEventos[3].length() > 0) {				// Verifica se veio algum evento

				MunicipiolLocalidade ml = null;
				// verifica se o id desse municipio ja esta no hashmap
				if (!hmMunicipioLocalidade.containsKey(idMun)) {
					// se nao tiver, busca o municipio
					
					// pega o municipio do banco para ser colocado no MunicipioLocalidade
					Municipio municipio = mdao.findById(idMun);
					if (municipio != null) {						// se achou municipio
						if(uf == null){
						   uf = municipio.getUf();
						   this.result.include("uf", municipio.getUf());
						}
						// cria o MunicipioLocalidade e seta o municipio
						ml = new MunicipiolLocalidade();
						ml.setMunicipio(municipio);
						// cria um ArrayList de LocalidadeEvento para ser populado depois
						ml.setLocalidadeEventoList(new ArrayList<LocalidadeEvento>());
						// adiciona o municipioLocalidade no Hashmap usando o id como chave
						hmMunicipioLocalidade.put(municipio.getIdmunicipio(), ml);	
						
					} else {
						System.out.println("Opa nao achei esse municipio !!! ");
					}
				} else {
					// o municipio jah existe na lista, soh pegar
					ml = hmMunicipioLocalidade.get(idMun);
				}

				
				Long idLoc = Long.parseLong(munLocNivelEventos[1]);		// pega o idLocalidade do indice 1 do array munLocNivelEventos
				Localidade localidade = ldao.findById(idLoc);			// busca localidade no banco
				
				Long idNivel = Long.parseLong(munLocNivelEventos[2]);	// pega o idNivel do indice 2 do array munLocNivelEventos
				Nivel nivel = ndao.carrega(idNivel);					// busca nivel no banco
				
				
				// se achou localidade e nivel o banco 
				if (localidade != null && nivel != null) {
					// cria o obj LocalidadeEvento para ser incluido no MunicipioLocalidade
					LocalidadeEvento locEvento = new LocalidadeEvento();
					locEvento.setLocalidade(localidade);				// seta a localidade
					locEvento.setNivel(nivel);							// seta o nivel
					locEvento.setEventoList(new ArrayList<Evento>());	// cria Array List de Evento para ser populado posteriormente
					// pega os eventos
					String[] eventos = munLocNivelEventos[3].split(","); // pega os idNivel do indice 3 do array munLocNivelEventos 
					for(String evt : eventos){	// para cada evento
						System.out.println("Evento: "+evt);
						
						Long idEvento = Long.parseLong(evt);	// converte para Long
						Evento e = edao.carrega(idEvento);		// busca evento no banco
						locEvento.getEventoList().add(e);		// adiciona o evento na lista do LocalidadeEvento
					}				
					
					// guarda o eventoLocalidade no array dentro do objeto MunicipioLocalidade
					ml.getLocalidadeEventoList().add(locEvento);
					//
				} else {
					System.out.println("Nao achou Localidade ou Nivel.");
				}
			}
		}
		
		Set<Long> keys = hmMunicipioLocalidade.keySet();
		
		List<MunicipiolLocalidade> listMunLoc = new ArrayList<MunicipiolLocalidade>();
		
		
		for(Long k : keys){
			MunicipiolLocalidade ml = hmMunicipioLocalidade.get(k);
			System.out.println("ML: ");
			System.out.println(ml);
			
			listMunLoc.add(ml);
		}
		
		this.result.include("municipio", listMunLoc);
	}

	public class MunicipiolLocalidade {
		private Municipio municipio;
		private List<LocalidadeEvento> localidadeEventoList;

		public Municipio getMunicipio() {
			return municipio;
		}

		public void setMunicipio(Municipio municipio) {
			this.municipio = municipio;
		}

		public List<LocalidadeEvento> getLocalidadeEventoList() {
			return localidadeEventoList;
		}

		public void setLocalidadeEventoList(
				List<LocalidadeEvento> localidadeEventoList) {
			this.localidadeEventoList = localidadeEventoList;
		}
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append(this.municipio.getCidade()).append("\n");
			for(LocalidadeEvento ld : this.localidadeEventoList){
				sb.append(ld.toString()).append("\n");
			}
			return sb.toString();
		}

	}

	public class LocalidadeEvento {
		private Localidade localidade;
		private Nivel nivel;
		private List<Evento> eventoList;

		public Localidade getLocalidade() {
			return localidade;
		}

		public void setLocalidade(Localidade localidade) {
			this.localidade = localidade;
		}

		public Nivel getNivel() {
			return nivel;
		}

		public void setNivel(Nivel nivel) {
			this.nivel = nivel;
		}

		public List<Evento> getEventoList() {
			return eventoList;
		}

		public void setEventoList(List<Evento> eventoList) {
			this.eventoList = eventoList;
		}
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append(localidade.getDescricao()).append("\n");
			sb.append(nivel.getDescricao()).append("\n");
			for(Evento e : this.eventoList){
				sb.append(e.getDescricao()).append("\n");
			}
			return sb.toString();
		}

	}
}

será que ele não está procurando a foto no lugar errado? ele te deu o eu.jpg, mas vc precisa retornar o File desse arquivo na pasta correta. Isso no seu business

Lucas, consegui…

O Problema era que eu não estava entendendo direito como fazer pra passar o parâmetro da imagem pro método. E fiz como vc sugeriu, pra retornar o tipo FILE.

segue como ficou:

VersaoController

@Get
	@Path("/versao/visualiza")
	public File downloadFoto() {
		return business.mostra();
	}
	
	@Post
	@Path("/versao/visualiza")
	public void visualiza(String vigencia, String atualizacao, List<String> mun,
			List<String> local, Long[] nivelSel, Versao versao, VersaoImagem imagem /*final UploadedFile picture,*/) throws Exception {
	
		/* Header do Alerta */
		this.result.include("idalerta", dao.retornaSequenceAlerta());
		this.result.include("atualizacao", atualizacao);
		this.result.include("data", fd.getdatahora());
		this.result.include("vigencia", vigencia);
		this.result.include("versao", versao);
		this.result.include("imagem",imagem); //envia a "legenda" da imagem pra visualiza.jsp
		
		business.salvarFoto(imagem.getUpload());
		 
		String uf = null;

		HashMap<Long, MunicipiolLocalidade> hmMunicipioLocalidade = new HashMap<Long, MunicipiolLocalidade>();

VersaoBusiness

@Component
public class VersaoBusiness {

	private CustomMultipartConfig tamanho;
	private File pastaImagens;
	private VersaoImagem imagem;

	public VersaoBusiness(CustomMultipartConfig tamanho, ServletContext context, VersaoImagem imagem) {
		this.tamanho = tamanho;
		this.imagem = imagem;
		
		String caminhoImagens = context.getRealPath("WEB-INF/imagens");
		pastaImagens = new File(caminhoImagens);
		pastaImagens.mkdir();
	}
	

	public VersaoImagem salvarFoto(UploadedFile picture) throws IOException {
		
		if (picture != null) {
			if (picture.getFile().available() > tamanho.getSizeLimit()) {
				System.out.println("tamanho inválido");
			} else {
				System.out.println("pegou a imagem");
				String fileName = picture.getFileName();
				
				imagem.setNome(fileName);
				
				try {
					IOUtils.copyLarge(picture.getFile(), new FileOutputStream(new File(pastaImagens + "/" + fileName)));
				} catch (FileNotFoundException e) {
					e.printStackTrace();
					throw new FileNotFoundException("Arquivo não encontrado!");
				} catch (IOException e) {
					e.printStackTrace();
					throw new IOException("Não foi possível enviar o arquivo!");
				}
			}
		} else {
			System.out.println("não pegou a imagem");
		}
		return imagem;
	}

	public File mostra() {
		return new File(pastaImagens, imagem.getNome());
	}

}

visualiza.jsp

<div>
	<p>Legenda: ${imagem.legenda} </p>
	<p>
 		<img src="<c:url value="/versao/visualiza"/>" width="90" height="90" border="0"/>
	</p>
</div>

VersaoImagem.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;

import org.hibernate.envers.Audited;

import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@Entity
@Audited
@Table(name="alt_versao_imagem", schema="public")
@SequenceGenerator(name = "sequence", sequenceName = "public.versao_imagem_sequence", schema="public")
@SessionScoped
public class VersaoImagem {
	
	@Id
	@NotNull
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_imagem")
	private Long idimagem;
	
	@JoinColumn(name="id_versao", referencedColumnName = "id_versao")
	@ManyToOne
	private Versao versao;
	
	@Column(name="nome")
	private String nome;
	
	@Column(name="legenda")
	private String legenda;
	
	@Column(name="caminho")
	private String caminho;
	
	@Transient
	private UploadedFile upload;
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Long getIdimagem() {
		return idimagem;
	}

	public void setIdimagem(Long idimagem) {
		this.idimagem = idimagem;
	}

	public Versao getVersao() {
		return versao;
	}

	public void setVersao(Versao versao) {
		this.versao = versao;
	}

	public String getLegenda() {
		return legenda;
	}

	public void setLegenda(String legenda) {
		this.legenda = legenda;
	}

	public String getCaminho() {
		return caminho;
	}

	public void setCaminho(String caminho) {
		this.caminho = caminho;
	}

	public UploadedFile getUpload() {
		return upload;
	}

	public void setUpload(UploadedFile upload) {
		this.upload = upload;
	}

}

Muito obrigado Lucas e Garcia pela força