Download de arquivos no Spring MVC

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.

 

Advertisements

3 thoughts on “Download de arquivos no Spring MVC

  1. Muito bacana, Alberto!

    O SpringMVC não tem uma API no estilo FileDownload ou ByteArrayDownload para facilitar a vida do programador?

    Like

    • 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.

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s