Em um dos projetos que participo atualmente, temos que disponibilizar um zip para download ao fim de uma sequência de telas. Caso eu já tivesse o arquivo pronto, não teria nenhuma dificuldade. Bastaria criar um link na página apontando para o local do arquivo, desta maneira o usuário realizaria o download dele tranquilamente. Uma outra situação, que é o meu caso, é quando necessitamos construir o arquivo naquele determinado momento, em função do que foi solicitado pelo usuário. Abaixo segue o exemplo do código do método do controller que disponibiliza o download.
@RequestMapping(method = RequestMethod.GET) public HttpEntity<byte[]> download(String token) { byte[] zipBytes = //pega os bytes de qualquer arquivo HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.add("Content-Disposition", "attachment; filename=\""+fileToBePacked.getName()+"\""); HttpEntity<byte[]> entity = new HttpEntity<byte[]>(zipBytes,httpHeaders); return entity; }
Perceba que o código é bem direto. Apenas retornamos o array de bytes que representa os dados do arquivo que acabamos de montar. Neste exemplo, apenas para fins de curiosidade, usei o projeto zt-zip(https://github.com/zeroturnaround/zt-zip) da Zero Turnaround para poder gerar o zip. Um detalhe mais interessante é o uso da classe HttpEntity, ela permite que você construa a resposta HTTP de maneira bem customizada, definindo os headers que você achar necessário. No nosso caso adicionamos o header Content-Disposition, para que fosse possível definir o nome do arquivo a ser baixado.
Este foi um post bem simples, mas espero que seja útil :). Continuarei na saga de fazer um post por semana, mesmo que de vez em quando o assunto seja simples. Por sinal, para você que leu, prefere posts sempre práticos ou quer ver um post sobre algum detalhe mais interno do framework? Especificamente para o dia de hoje, eu fiquei em dúvida sobre qual caminho seguir.
Muito bacana, Alberto!
O SpringMVC não tem uma API no estilo
FileDownload
ouByteArrayDownload
para facilitar a vida do programador?LikeLike
Oi Rafael, não conheço nada tão elegante dentro dele :). O mais próximo que tenho conhecimento é a interface Resource, que contém implementações como FileSystemResource e InputStreamResource. Esse também é um caminho para devolver binários que devem ser baixados pelo cliente.
LikeLike
[…] um tempo atrás, escrevi um post sobre como realizar download de arquivos utilizando o Spring MVC. Rafael Ponte, um amigo meu, empreendedor/programador que mora em […]
LikeLike