10Download e Upload
Exemplo de 1 minuto: download
O exemplo a seguir mostra como disponibilizar o download para seu cliente. Note novamente a simplicidade na implementação:
@Resource
public class PerfilController {
public File foto(Perfil perfil) {
return new File("/path/para/a/foto." + perfil.getId()+ ".jpg");
}
}
Adicionando mais informações no download
Se você quiser adicionar mais informações ao download você pode retornar um FileDownload:
@Resource
public class PerfilController {
// dao ...
public Download foto(Perfil perfil) {
File file = new File("/path/para/a/foto." + perfil.getId()+ ".jpg");
String contentType = "image/jpg";
String filename = perfil.getNome() + ".jpg";
return new FileDownload(file, contentType, filename);
}
}
Você pode também usar a implementação InputStreamDownload para trabalhar diretamente com Streams ou ByteArrayDownload para array de bytes (desde a 3.2-snapshot).
Upload
Para ativar o suporte a upload é necessário adicionar as bibliotecas commons-upload e commons-io em seu classpath. Na versão 3.2 do VRaptor, caso você estiver em um container que implemente a JSR-315 (Servlet 3.0), não serão necessários os JARs commons-upload e commons-io, pois o próprio container já implementa a funcionalidade de upload.
Exemplo de 1 minuto: upload
O primeiro exemplo será baseado na funcionalidade de upload multipart.
@Resource
public class PerfilController {
private final PerfilDao dao;
public PerfilController(PerfilDao dao) {
this.dao = dao;
}
public void atualizaFoto(Perfil perfil, UploadedFile foto) {
dao.atribui(foto.getFile(), perfil);
//O stream deve ser fechado
foto.getFile().close();
}
}
Mais sobre Upload
O UploadedFile retorna o arquivo como um InputStream. Se você quiser copiar para um arquivo no disco facilmente, basta usar o IOUtils do commons-io:
public void atualizaFoto(Perfil perfil, UploadedFile foto) {
File fotoSalva = new File();
IOUtils.copyLarge(foto.getFile(), new FileOutputStream(fotoSalva));
dao.atribui(fotoSalva, perfil);
}
Sobrescrevendo as configurações de upload
Você pode alterar as configurações de upload sobrescrevendo a classe MultipartConfig. No exemplo abaixo é alterado o tamanho máximo de upload.
@Component
@ApplicationScoped
public class CustomMultipartConfig extends DefaultMultipartConfig {
public long getSizeLimit() {
return 50 * 1024 * 1024; // 50MB
}
}
Alterando o formulário de envio
Para que o browser possa fazer o upload corretamente, você precisa adicionar o atributo enctype para multipart/form-data:
<form action="minha-action" method="post" enctype="multipart/form-data">
Validando o upload
Quando o tamanho máximo para upload de arquivo exceder o valor configurado, o VRaptor adiciona uma mensagem no objeto Validator.