Olá desenvolvedores, neste tutorial implementaremos o download de imagens com o PrimeFaces. No tutorial anterior implementamos o upload e de forma surpreendentemente fácil, é incrível o que se pode fazer quando se domina o framework.

Em nossa tela o usuário poderá fazer o download da imagem clicando em um botão adicionado na tabela que exibe os usuários cadastrados. É também a partir da tabela que várias ações podem ser disparadas, com editar ou remover algum registro e agora o download.

DOWNLOAD | FRONT-END

Assim no p:form correspondente a tabela adicione mais uma coluna, p:column, com o atributo headerText defina um cabeçalho para ela. No escopo da coluna adicione o botão de comando do JSF – JavaServer Faces, h:commandLink, cujo valor é o que será exibido para o usuário em tela. Para que todas as validações sejam “puladas”, definiremos o atributo immediate como sendo true, assim, quando ele invocar a ação, aplicará apenas os valores da solicitação.

O método download() será chamado por meio do actionListener que a partir da interação do usuário com o botão de comando irá disparar um evento ou uma ação, neste caso, invocará o método.

Precisaremos obter do servidor o código da pessoa cuja ação de download foi solicitada, e para isso precisaremos passar um parâmetro, f:param. Desse modo com o atributo value obteremos o código do usuário.

Com o componente h:graphicImage atribuiremos uma imagem para o botão, onde deverá ser definido a altura e largura da imagem.

MÉTODO DOWNLOAD()

No ManagedBean procederemos com a implementação do método download() que obterá o parâmetro fileDownloadId por meio de um map. O map cumpre a missão de transformar uma grande quantidade de dados em uma pequena quantidade de informações.

Para obter o parâmetro desejado precisaremos da lista de parâmetros do JSF que obteremos por meio do FacesContext que conterá todas as informações de estado relacionadas ao processamento da solicitação.

O getCurrentInstance retornará a instância FacesContext para a solicitação que está sendo processada pelo encadeamento atual. Até que finalmente o getCurrenteInstanceMap cujos valor do tipo String é o valor correspondente ao parâmetro retornado pela solicitação. E agora sim, teremos uma variável do tipo String recebendo o valor do parâmetro.

A consulta do objeto na base de dados, ainda no método download() invocará o método pesquisar() do daoGeneric que como argumento receberá o parâmetro que é o código do objeto e a classe onde a consulta deverá ser realizada.

Com o objeto pessoa em mãos, ou seja, sabendo para quem o download foi solicitado é hora de preparar a imagem para o download. Assim, com um array de byte iremos buscar a imagem que desejamos baixar. Esta imagem que está no formato de uma String será retornada em formato de um byte[].

A imagem que obteremos virá com um cabeçalho qual deveremos “separar” em parte, para obter a imagem em base64. Para “quebrar” o cabeçalho em partes de forma que possamos especificar o que desejamos pesquisar utilizaremos por meio do método split() o regex.

Regex é uma expressão regular em que uma sequência de caracteres forma um padrão de pesquisa. Ao pesquisar dados em um texto poderemos usar esse padrão de pesquisa para descrever o que estamos procurando. Neste caso obteremos o que está na primeira posição da expressão, a imagem em base64.

ESCREVENDO A RESPOSTA

Após todo este processamento é preciso dar um retorno para o usuário utilizando o objeto HttpServletResponse. Após obter a resposta construiremos os argumentos para o download adicionando um cabeçalho de resposta.

Assim o argumento content-disposition indica se o conteúdo será exibido como parte da página ou se será realizado o download, o que é indicado por meio do segundo argumento. Desse modo o attachment indicará que desejamos fazer o download, o terceiro argumento determina um nome padrão para a imagem a ser “baixada” e a extensão.

Na sequência seguem as informações padrão da implementação, em que informamos o tipo de arquivo a ser “baixado” e o tamanho dele. Escrevemos a resposta e depois de processada todas as informações daremos um flush() liberando o fluxo de saída e gravando a saída em um buffer. Por fim, informamos ao JSF que a resposta está completa.

EM POUCAS PALAVRAS

Neste tutorial implementamos o método download() com um pouco mais de código quando comparamos com o método de upload(),  mas ainda assim, mais simples do que a implementação com JSP – JavaServer Pages e Servelets. E recordamos também conceitos importantes sobre a base64.