Olá desenvolvedores, dando continuidade a implementação da parte 1 da rotina de download da imagem. Neste tutorial nos concentraremos na conversão da imagem em base64 para bytes e assim poder proceder com o download. Então para ajudá-lo a se localizar, estamos trabalhando com o método doGet da servlet FileUpload.java. E aqui estamos tratando a parte onde o parâmetro de ação passado é igual a download.

CABEÇALHO DE RESPOSTA

Assim, se o parâmetro de ação passado é igual a download e se imagem a for diferente de nulo, procederemos com os passos necessários para que o download seja feito. E para que seja possível fazer a implementação da rotina de download da imagem na mesma página é preciso “setar” o cabeçalho na resposta HTTP, o qual recebe dois parâmetros.

Desse modo, o primeiro parâmetro “seta” o conteúdo e indica se ele será exibido no navegador. Em outras palavras define se o arquivo será aberto como uma página Web ou parte de uma, ou como um anexo que é baixado e salvo localmente. Então utilizaremos o attachment para indicar que ele deverá ser baixado. Já o segundo parâmetro, por sua vez, é usado para sugerir um nome para o arquivo que será baixado.

MÉTODO SPLIT()

Agora para possibilitar o download da imagem que está no banco de dados em base64, será preciso convertê-la para um arquivo de bytes. E para isso consideraremos tudo que está à direita da vírgula na imagem em base64 no banco de dados.

Dessa forma, para pegar só a parte que nos interessa da imagem, trabalharemos com o método split. Este método quebra a string em várias substrings a partir de um caracter definido, neste caso a vírgula, e retorna em um array, pegando o conteúdo que estará na posição um, visto que o conteúdo a esquerda da vírgula está na posição zero.

CONVERSÃO DA BASE64 PARA BYTES

O próximo passo é a conversão da String que referencia a imagem em base64, para byte para retornarmos na resposta. Isto é, o fluxo de dados a ser retornado deverá ser em bytes.

Desse modo, criaremos um array de bytes que receberá o objeto Base64 da biblioteca org.apache.tomcat.util.codec.binary.Base64, invocando o decodeBase64 que recebe uma String e a decodifica retornando um array de bytes. O decodBase64 e receberá como argumento a variável imagemPura, cujo conteúdo, a imagem em base64, foi “quebrada” pelo método split().

Ainda na estrutura de decisão if, criaremos um objeto de entrada. Onde estamos criando uma entrada de dados para receber os dados do array de bytes.

InputStream is = new ByteArrayInputStream(imageBytes);

E enquanto houver dados dentro do objeto criado “is”, o processamento continuará, e para esta verificação teremos uma variável de controle inicializada com o valor zero.

Int read = 0;

A seguir instanciaremos uma array de bytes que por padrão é 1024. E então pegaremos o objeto de resposta da requisição e escreveremos dentro dele.

OutputStream os = response.getOutputStream();

Enquanto tiver dados, ou enquanto for diferente de -1, o que significa que há dados dentro do objeto de entrada InputStream escreveremos a resposta. Assim, o objeto de saída invocará o método write que como parâmetro receberá os bytes, o tamanho zero e a variável de controle.

Ao finalizar a escrita pegaremos a resposta, a partir do objeto de resposta, a enviaremos e fecharemos, com os respectivos comandos abaixo.

os.flush(); 
os.close();

EM POUCAS PALAVRAS

E agora temos a rotina de download funcionando corretamente. Mas atente-se para a importância do cabeçalho, sem o qual a imagem seria aberta em uma nova aba do navegador. Da forma como fizemos estamos informando ao navegador como queremos que ele trate a imagem. Eu fico por aqui e nos vemos no próximo tutorial.