Olha ai Lucas. Consegui! =)
O código ficou assim:
Classe componente Imagens:
@Component
public class Imagens {
private File pastaImagens;
public Imagens() {
String pastaImagens = "/home/bruno/fotos";
this.pastaImagens = new File(pastaImagens);
File destino = new File(pastaImagens);
destino.mkdir();
}
public void salva(UploadedFile imagem, Imovel imovel) {
File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem");
try {
IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
} catch (IOException e) {
throw new RuntimeException("Erro ao copiar imagem", e);
}
}
public File mostra(Imovel imovel) {
return new File(pastaImagens, imovel.getIdImovel() + ".imagem");
}
}
Classe ImagensController (ficou bem enxuta):
@Resource
public class ImagensController {
private final Imagens imagens;
private final Result result;
public ImagensController(Imagens imagens, Result result) {
this.imagens = imagens;
this.result = result;
}
@Post
@Path("/imovel/{imovel.idImovel}/imagem")
public void upload(Imovel imovel, final UploadedFile imagem) {
imagens.salva(imagem, imovel);
result.redirectTo(ImovelController.class).edita(imovel.getIdImovel());
}
@Get
@Path("/imovel/{imovel.idImovel}/imagem")
public File download(Imovel imovel) {
return imagens.mostra(imovel);
}
}
Após enviar a imagem, redireciona para a própria jsp de edição, o usuário clica em e redireciona para a jsp de listagem.
Ao invés de criar o form de envio da imagem no formulário, criei na página de edição, ficou conforme está na apostila da Caelum:
<form action="<c:url value="/imovel/${imovel.idImovel }/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>
Consegui de primeira, pois todo o código estava pronto, bastava remover aquela taglib do form do formulário.
Fica ai o código pra quem precisar. Claro que pode ser melhorado, falta ainda a parte de validação da imagem, pode incluir a parte de redimensionamento e também alguma forma de criar galeria de imagem, pois da forma que está só vai uma imagem, se o usuário clicar de novo no upload de imagem, vai sobrescrever a existente. =/
Na listagem estou usando o framework Displaytag, e para listar a imagem no grid fiz assim:
<display:table name="${imovelList}" pagesize="5" id="imovel" requestURI="/Imobiliaria/imovel/lista" export="true">
<display:column>${imovel_rowNum}</display:column>
<display:column title="Imagem"><img src="<c:url value="/imovel/${imovel.idImovel}/imagem"/>" width="100" height="100"/></display:column>
<display:column property="codImovel" title="Codigo" />
<display:column property="titulo" title="Titulo" />
<display:column property="bairro" title="Bairro" />
<display:column property="valor" title="Valor" />
<display:column property="area" title="Área" />
<display:column title="Remover"><a href="remove?idImovel=${imovel.idImovel}">remover</a></display:column>
<display:column title="Alterar"><a href="edita?idImovel=${imovel.idImovel}">alterar</a></display:column>
</display:table>
Abraço!!!