[Resolvido]Problema ao atualizar registro com imagem no Vraptor

Boa noite . No meu projeto estou fazendo um upload e download de imagens no banco de dados (mssql 2005) e até certo ponto esta funcionando.Mas quando eu vou atualizar um registro sem selecionar uma nova imagem , sendo que esta já tem uma img no banco de dados , ele sempre retorna null .Eu coloquei a variavel que recebe o arquivo do banco de dados no formulário como hidden assim como faço para outros campos que não serão alterados e mesmo assim esta variavel sempre retorna null para o controller.

Controle que salva os dados do formulário e a foto

public void atualiza(final Usr usr ,UploadedFile foto)  {				
    if (foto != null){
	usr.setUsrFoto(uploadFoto.converter(foto));
	usr.setUsrFotoExt(uploadFoto.extensao(foto));
    }
    ...

Classe para converter UploadFile do Vraptor para byte[]

@Component
public class UploadFoto {
	public byte[] converter(UploadedFile file){
		try {			
			InputStream stream = file.getFile();
			ByteArrayOutputStream baos = new ByteArrayOutputStream();			  
			IOUtils.copy(stream, baos);
			byte[] foto = baos.toByteArray();			 
			return foto;
		}		
		catch (Exception e) {			
			return null;
		}			
	}
	public String extensao(UploadedFile file){
		try {
			String nome = file.getFileName();
			Integer tamanho = nome.length();
			return nome.substring(tamanho -3,tamanho).toUpperCase();   
		} catch (Exception e) {		
			return null;
		}
	}
}

Trecho do formulário:

<form id="usrForm" action="${pageContext.request.contextPath}/usr/atualiza" method="post" enctype="multipart/form-data">
...
<input type="hidden" name="usr.usrFoto" value="${usr.usrFoto}" />
<input type="hidden" name="usr.usrFotoExt" value="${usr.usrFotoExt}" />
...
<img    />
...
&lt;input type="file" name="foto" /&gt;

E aonde faço o download da imagem :

@Public
	@Get("/usr/{usr.id}/imagem")
	public Download downloadImage(usr usr) {
		usr = repository.loadById(usr.getId());
		String nomeArq = ("usr-" + usr.getId() + "-Foto." + usr.getusrFotoExt());		
		byte[] foto = usr.getUsrFoto();			
		try {				
			//convert array of bytes into file
			FileOutputStream fileOuputStream = new FileOutputStream("e:\\imagens\\" + nomeArq); 
			fileOuputStream.write(foto);
			fileOuputStream.close();
			System.out.println("Done");
		}catch(Exception e){
			e.printStackTrace();
		}
		File file = new File("e:\\imagens\\" + nomeArq);	
		if (!file.exists()) {
			return new FileDownload(new File("e:\\teste.jpg", "default.jpg"), "image/jpg", "default.jpg");
		}
		String fileName = usr.getUsrnome().replaceAll(" ", "-") + ".jpg";
		return new FileDownload(file, "image/jpg", fileName);
	}	

Provavelmente o meu problema é como guardar o valor da variavel usrFoto que é um byte[] na jsp e retornar esse mesmo valor intacto no controller.Alguem tem ideia ?Obrigado!

a idéia é manter a foto que já existe? se sim, não coloque a imagem em um input hidden, faça o load do dusr no controller e copie a imagem antiga pra nova caso o arquivo não tenha sido uploadado (o UploadedFile vem null)

Sim a ideia é manter a foto que já existe se nenhuma outra for adicionada.No caso a imagem antiga deve ser guardada numa variavel global do controller ? Pois eu mando os dados no método editar e salvo no método atualiza.

não… vc faz assim:


if (upload == null) {
   Dusr antigo = buscaOCaraAntigoDoBd(novo.getId());
   novo.setImagem(antigo.getImagem());
}
//resto do código

Demorei um pouco pois estava sem a fonte.Deu certo Lucas , muito obrigado !Mas te perguntar , não tem outro jeito não né ? Achei meio pog , apesar de input hidden tambem ser.

não é pog… é o que a gente faz normalmente…

o ideal é sempre buscar o objeto que está no banco e só alterar os campos que vc sabe que vieram do formulário.

Interessante , como estou fazendo em cima de um banco de dados gigantesco com as tabelas com muitas colunas eu coloco vários hidden no formulário para não ter que alimentar tudo.Não sabia que podia fazer do jeito que falou , me poupou vários hidden !Obrigado !