--- title: Download 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: ~~~ #!java @Controller 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`: ~~~ #!java @Controller public class PerfilController { 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); } } ~~~ Para as situações em que você tem um `InputStream`, você pode utilizar o `InputStreamDownload`, conforme o exemplo abaixo: ~~~ #!java public Download foto(Perfil perfil) { InputStream stream = [...]; String contentType = "image/jpg"; return new InputStreamDownload(stream, contentType, filename); } ~~~ E como outra opção há o `ByteArrayDownload`, usado quando você tem um array de bytes. ~~~ #!java public Download foto(Perfil perfil) { byte[] conteudoFoto = [...]; String contentType = "image/jpg"; return new ByteArrayDownload(conteudoFoto, contentType, filename); } ~~~ ##Upload Para ativar o suporte a upload é necessário adicionar as bibliotecas `commons-upload` e `commons-io` em seu classpath. Veja mais informações [aqui](/pt/docs/dependencias-e-pre-requisitos/#commons-fileupload). #Exemplo de 1 minuto: upload Para receber um upload você precisa receber um `UploadedFile` em seu método conforme o exemplo abaixo. O `UploadedFile` retorna o arquivo como um `InputStream`. Com isso você pode copiar o arquivo para o disco facilmente. ~~~ #!java public void atualizaFoto(Perfil perfil, UploadedFile foto) { try (InputStream input = foto.getFile()) { File fotoSalva = new File("/path/to/file/repository", foto.getFileName()); Files.write(input, fotoSalva); dao.atribui(fotoSalva, perfil); } } ~~~ ##Sobrescrevendo as configurações de upload Você pode alterar as configurações de upload sobrescrevendo a classe `MultipartConfig`. O valor padrão para upload de arquivos é limitado a 2MB, mas você pode facilmente alterar estes valores. No exemplo abaixo é alterado o tamanho total permitido no upload (soma de todos os arquivos). ~~~ #!java @Specializes @ApplicationScoped public class CustomMultipartConfig extends DefaultMultipartConfig { public long getSizeLimit() { return 50 * 1024 * 1024; // 50MB } } ~~~ No exemplo a seguir podemos alterar o tamanho máximo permitido para cada arquivo: ~~~ #!java @Specializes @ApplicationScoped public class CustomMultipartConfig extends DefaultMultipartConfig { public long getFileSizeLimit() { 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`: ~~~ #!jsp
~~~ ##Validando o upload Quando o tamanho máximo para upload de arquivo exceder o valor configurado, o VRaptor adiciona uma mensagem no objeto `Validator`.