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 />
...
<input type="file" name="foto" />
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!