Olá desenvolvedores, até o momento nesta série de tutorias trabalhamos com upload e download de imagens, inclusive gravando no banco de dados. Mas e se sua aplicação exigir que sejam feitos uploads e downloads também de arquivos em PDF, será que a implementação é feita da mesma forma como procedemos com as imagens? É o que iremos descobrir no tutorial de hoje.

Observe abaixo a parte a esquerda da vírgula de dois arquivos em base64. Note que a diferença de um arquivo de imagem para um arquivo PDF em base64 reside nesta parte da codificação.

data:image/jpeg;base64,
data:application/pdf;base64,

É exatamente esta parte que iremos trabalhar no banco de dados para que possamos distinguir imagem de arquivo PDF. Entenda, a base4 é a mesma para todos os tipos de arquivo, assim o que precisamos é do tipo de arquivo especificado. Dessa forma criaremos no banco de dados uma coluna para gravar o tipo do arquivo.

BANCO DE DADOS

Então, com o seu banco de dados aberto, selecione a base de dados e a tabela correspondentes, com a tabela selecionada abra o SQL Editor. Altere a tabela usuario adicionando uma nova coluna do tipo character.

UPLOAD DE ARQUIVOS

Nossa primeira providência na classe de conexão será por meio do método split quebrar a String. Assim, poderemos pegar os elementos da primeira posição que é o que nos interessa.

String tipoDados = imagem.split(“,”)[0];

Lembrando que o método split quebra a string em várias substrings a partir de um caractere definido, neste caso a vírgula, e as retorna em um array. Ressaltando também que podemos fazer dessa forma simples porque a base64 traz apenas uma vírgula.

Tendo feito este primeiro split o que restou é que estava a esquerda da vírgula. Agora faremos um novo split, porém dessa vez a referência será o ponto e vírgula, visto que nos interessa a parte que define o tipo do arquivo. E depois faremos um terceiro split utilizando a barra como elemento separador, porém dessa vez o que nos interessa é o que está à direita da barra, isto é, a segunda posição do array que corresponde exatamente a extensão do arquivo.

Agora no método gravarImagem() na classe de conexão DaoUsuario, adicione no insert a coluna que acabamos de criar. Desse modo, a Query trabalhará com duas possibilidades de inserção, imagem ou arquivo do tipo PDF.

Entretanto, no momento de “setar” os parâmetros iremos passar a variável do tipoDados e não o dado em si.

insert.setstring(2, tipoDados);

Nosso sistema está pronto para gravar qualquer tipo de arquivo, seja ele uma imagem ou arquivo de PDF. Agora vamos tratar a rotina de download.

DOWNLOAD DE ARQUIVOS

Para o download da imagem apenas consultávamos no banco de dados uma String. Agora não iremos mais retornar uma String, mas o objeto de usuário “setando” e retornando as informações que são pertinentes para o contexto da implementação.

É preciso antes criar o atributo tipofile na classe do objeto Usuario.java, e “setar” os métodos Getters and Setters para ele.

private String tipofile;

Assim, voltando para o DaoUsuario, no escopo do método buscaoImagem(), a Query SQL buscará todos os atributos.

String sql = “select * from usuario where id = “ + iduser;

O passo seguinte é, dentro do laço de repetição while “setar’ e recuperar os dados que nos interessa a partir da instanciação do objeto usuário. Note que iremos trazer todos os dados.

ADENDO

A partir das implementações que foram feitas neste tutorial se torna necessário alguns ajustes no código que escrevemos anteriormente. Assim, na servlet FileUpload, uma vez que iremos buscar o objeto usuario no lugar da String, proceda com esta correção no doGet(), quando o parâmetro de ação for igual a download.

No primeiro split para o download da imagem, agora que temos um objeto, é preciso recuperá-lo para retornar.

E para o tipo de arquivo será feita uma concatenação, pegando com a variável imagem de dentro do usuario o tipo do arquivo.

EM POUCAS PALAVRAS

E agora temos uma rotina de upload e download para qualquer tipo de arquivo funcionado com perfeição para você implementar em suas aplicações. Então, estude, pratique e refaça quantas vezes forem necessárias. Eu fico por aqui e nos vemos no próximo tutorial.