Olá desenvolvedores, hoje iremos implementar o download de um arquivo. No tutorial anterior nos concentramos no upload e na gravação do arquivo no banco de dados, este tutorial você pode conferir aqui.
Assim, para começarmos a tratar o download, iremos na página cadastroUsuario.jsp criar um campo que dá ao usuário esta opção. E ressaltando novamente que estas implementações que estamos fazendo possuem caráter didático e visa introduzi-lo no contexto da lógica necessária a este tipo de implementação.
Inserir e baixar uma imagem, inserir um arquivo e fazer o download do mesmo, trabalhar com web service, são conhecimentos necessários ao seu arsenal do dia a dia como programador.
E, logicamente todas essas implementações não serão como estamos fazendo aqui, em um único formulário, mas novamente, a intenção é a lógica, a “perfumaria” é com você e a seleção serão implementadas de acordo com a necessidade e regra de negócio.
IMPLEMENTANDO O DOWNLOAD NO JSP
Para fazermos o download do arquivo após clicar sobre a opção correspondente precisaremos de um link para fazermos a requisição do lado da servlet, ou seja, do lado do servidor.
E dentro do link iremos incorporar a tag do arquivo. O próximo passo é chamar uma classe Java do lado do servidor, a servlet, com o “salvarUsuario” passando a ação de download, bem com o código do usuário. E para que possamos distinguir imagem do arquivo iremos fazer uma pequena modificação no código da imagem adicionando o tipo, o mesmo faremos para o arquivo.
Porém no arquivo o link não será uma imagem. E lembrando como temos feitos, algumas informações (já implementadas em outros tutoriais) estão sendo suprimidas para nos concentrarmos apenas na implementação vigente.
E como, por conseguinte o arquivo é do usuário, passaremos o id dele, para que seja pesquisado no banco de dados a imagem daquele usuário, para então a rotina de entrar em ação.
Lembrando de implementar também o cabeçalho da tabela colocando uma tag <th> logo ao lado da imagem/foto.
IMPLEMENTANDO O DOWNLOAD NA SERVLET
Na servlet usuario.java, já temos implementada a ação e também o código do usuário. No método doGet, aproveitaremos o código para o download da imagem onde passamos para a servlet a ação de download.
Aproveitamos o código onde havíamos implementado em um laço de decisão as rotinas de deletar, editar e listar. Assim, se a ação escolhida pelo usuário na tela for para fazer o download, o fluxo do código será redirecionado para esta condição.
Dentro da condição, a primeira providência é capturar o tipo, aquele mesmo que adicionamos no input. Então, além da requisição do tipo de arquivo e também para que possamos proceder com a rotina de download iremos inicializar a String contentType sendo igual a vazio e o byte array inicializará como nulo.
E assim ao declararmos como fizemos, o array passa a ter um escopo global, e logicamente atribuiremos valores a ele de acordo com cada condição.
Se tipo for igual a imagem, o tipo de arquivo contentType receberá o tipo de arquivo correspondente do objeto usuário. E assim será feita também a conversão para a base64 de dentro do campo FotoBase64 do banco de dados.
Mas se não, se tipo for igual a um arquivo de pdf, por exemplo, do mesmo modo o contentType receberá o tipo de arquivo correspondente do objeto usuário. E assim será feita também a conversão para a base64 de dentro do campo FotoBase64 do banco de dados.
E fora dos laços de repetição deixamos apenas o response e seus parâmetros, estes parâmetros voltarão para o navegador, onde uma nova tela será aberta e então a imagem ou o arquivo serão carregados. E para realizar esta ação teremos que “setar” os parâmetros “content-Disposition” e “attchamentt” para o cabeçalho. o parâmetro attachmentt carrega ainda o nome do arquivo e a extensão.
EM POUCAS PALAVRAS
Então agora não apenas mandamos arquivos para o banco de dados como podemos fazer o download destes arquivos. Era um pedido dos nossos alunos, como cadastrar um arquivo, exibi-lo na tabela e ter a possibilidade de fazer o download deste arquivo. E aqui está. Espero que tenham gostado, eu fico por aqui e nos vemos no próximo tutorial.
IMPORTANTE: o Byte ArrayfileByte, é o mesmo imageFotoBytes que implementamos para imagem, apenas o modificamos para que a referência seja para qualquer tipo de arquivo. Da forma como estava antes poderia gerar alguma confusão pois faria parecer que a referência era especificamente para um arquivo de imagem.