You are on page 1of 17

Upload Java Introduo

Neste tutorial, mostrarei como se faz para enviar arquivos para um servidor atravs de uma aplicao Web, utilizando o Commons-FileUpload da Jakarta. Sero mostradas duas maneiras de se fazer isso:

1 Enviar uma imagem para o servidor guardando-a em um campo BLOB do Banco de Dados;

2 Enviar uma imagem para o servidor, guard-la em um diretrio e armazenar seu endereo no Banco de Dados;

Viso Geral
A API Commons FileUpload tornou fcil e robusta a capacidade de realizar Uploads atravs de seus Servlets e aplicaes Web.

FileUpload analisa gramaticalmente as requisies HTTP conforme RFC 1867(http://www.ietf.org/rfc/rfc1867.txt) "Form-based File Upload in HTML". Isto quer dizer que, se uma requisio http for submetida usando um mtodo POST, a partir de um formulrio tipo "multipart/form-data", ento FileUpload pode analisar gramaticalmente esse pedido, e retornar os resultados de maneira fcil para o mtodo que o chamou.

Download do FileUpload 1.1.1


Commons-FileUpload pode ser baixado a partir do endereo: http://jakarta.apache.org/commons/fileupload/index.html

Aps fazer o download e extrair os arquivos, adicione o commons-fileupload1.1.1.jar ao seu projeto.

Documentao
Neste tutorial procuraremos dar mais ateno codificao do que teoria. Uma documentao completa sobre o Commons-FileUpload pode ser encontrada em: http://jakarta.apache.org/commons/fileupload/using.html

http://jakarta.apache.org/commons/fileupload/apidocs/index.html

e, tambm no pacote FileUpload 1.1.1.zip

Definindo um formulrio para o envio do arquivo


Como exemplo, vamos fazer o upload de uma imagem para o servidor. Um formulrio simples deve ser criado em HTML para levar a imagem at nossa aplicao. Este formulrio deve obrigatoriamente ser do tipo multipart/form-data":

<form id="formImagem" name="formImagem" method="post" action="servletupload" enctype="multipart/form-data">

<input type="hidden" id="tipoForm" name="tipoForm" value="imagem">

<input name="imagem" type="file" accept="image/jpeg; image/gif; image/bmp; image/png" id="imagem" class="dados" maxlength="60" tabindex="1" value="c:/" style="position:absolute; top:23px; left:12px; width:500px; ">

<input type="submit" id="upload" name="upload" tabindex="2" style="position:absolute; top:20px; left:532px; >

</form>

Criando o Servlet
Agora vamos criar um Servlet para receber esta requisio:

import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.FileUpload; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException;

public class ServletUpload extends HttpServlet{

//Initialize global variables public void init() throws ServletException { }

//Process the HTTP Post request public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }

//Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

boolean isMultiPart = FileUpload.isMultipartContent(request); if (isMultiPart) { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); String formulario = ""; try { List items = upload.parseRequest(request); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.getFieldName().equals("tipoForm")) { formulario = item.getString(); } if (!item.isFormField()) { if (item.getName().length() > 0) { this.inserirImagem(item); } } } }

catch (FileUploadException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } } } // implementao de demais mtodos do Servlet. }

Inserindo e recuperando a Imagem em um Campo Blob


Se voc analisou o cdigo do Servlet acima, deve ter notado a chamada ao mtodoinserirImagem(item) que ainda no foi implementado. Pois bem, iremos agora escrever este mtodo que ir inserir a imagem em um campo Blob do banco de dados. Para este exemplo eu usei o MySql.

A estrutura e criao da tabela deste exemplo so:

TabelaTeste Codigo (Integer) Imagem (Blob)

CREATE TABLE TabelaTeste ( codigo imagem ); INT UNSIGNED NOT NULL, BLOB NOT NULL

A seguir a implementao do mtodo inserirImagem(FileItem item):

/** * @param item FileItem, representa um arquivo que enviado pelo formulario * MultiPart/Form-data * @throws IOException * @throws ServletException */ private void inserirImagem(FileItem item) {

Connection conexao = null;

/**

Estabelea a conexo

*/

PreparedStatement declaracao = null;

String sql = "INSERT INTO TabelaTeste (codigo, imagem) VALUES(?, ?) ";

try { declaracao = conexao.prepareStatement(sql); declaracao.setInt(1, 1); // codigo 1 declaracao.setBinaryStream(2, item.getInputStream(), (int) item.getSize() ); declaracao.executeUpdate();

} catch (SQLException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); }

A seguir, o mtodo recuperaImagem() mostra como fazer para recuperar esta imagem que foi inserida no Banco de Dados.

OBS: importar a classe com.mysql.jdbc.Blob

public ImageIcon recuperaImagem() {

Connection conexao = null;

/**

Estabelea a conexao

*/

Statement declaracao = null; ResultSet resultado = null; StringBuffer sql = new StringBuffer(); sql.append("SELECT imagem FROM tabelaTeste WHERE codigo = 1");

ImageIcon imagem = null; try { declaracao = conexao.createStatement(); resultado = declaracao.executeQuery(sql.toString());

if (resultado.next()) { Blob blob = (Blob) resultado.getBlob("imagem"); if (blob!=null){ imagem = new ImageIcon(blob.getBytes(1, (int) blob.length())); } } } catch (SQLException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } return imagem; }

Gravando e recuperando a Imagem em um diretrio do servidor


Os Exemplos acima mostraram como podemos fazer, de maneira bem simples, a insero e a recuperao de uma imagem para um campo blob do banco de dados.

Agora mostraremos uma outra forma de se fazer este upload, porm, vamos gravar a imagem em um diretrio do servidor e no banco de dados guardaremos apenas o endereo desta imagem.

Usaremos exatamente o mesmo formulrio criado (html) e o mesmo mtodo doGet() do Servlet mostrado acima. A nica diferena ser a chamada ao mtodo que ao invs de ser: this.inserirImagem(item); Ser this.inserirImagemDiretorio(item);

Para isto vamos criar uma outra tabela no Banco de Dados conforme a estrutura a seguir:

TabelaTeste2 Codigo (Integer) Imagem (Varchar)

CREATE TABLE TabelaTeste2 ( codigo INT UNSIGNED NOT NULL,

imagem );

VARCHAR (255)

Agora vamos escrever o mtodo inserirImagemDiretorio(FileItem item) que ir realizar duas tarefas:

1 Guardar a imagem em um diretrio do servidor; 2 Guardar no Banco de dados o endereo para recuperao desta imagem;

/** * * @param item FileItem, representa um arquivo que enviado pelo formulario * MultiPart/Form-data * @throws IOException */ private void inserirImagemDiretorio(FileItem item) throws IOException {

//Pega o diretrio /logo dentro do diretrio atual de onde a //aplicao est rodando

String caminho = getServletContext().getRealPath("/logo") + "/";

// Cria o diretrio caso ele no exista File diretorio = new File(caminho); if (!diretorio.exists()){ diretorio.mkdir(); }

// Mandar o arquivo para o diretrio informado String nome = item.getName(); String arq[] = nome.split("\\\\"); for (int i = 0; i < arq.length; i++) { nome = arq[i]; }

File file = new File(diretorio, nome); FileOutputStream output = new FileOutputStream(file); InputStream is = item.getInputStream(); byte[] buffer = new byte[2048]; int nLidos;

while ((nLidos = is.read(buffer)) >= 0) { output.write(buffer, 0, nLidos); } output.flush(); output.close();

//Guarda no banco de dados o endereo para recuperao da imagem

Connection conexao = null;

/**

Estabelea a conexo

*/

PreparedStatement declaracao = null;

String sql = "INSERT INTO TabelaTeste2 (codigo, imagem) VALUES(?, ?)

";

try { declaracao = conexao.prepareStatement(sql); declaracao.setInt(1, 1); // codigo 1 declaracao.setString(2, caminho); resultado = declaracao.executeUpdate(); } catch (SQLException sqlEx) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } }

Escrevendo o mtodo recuperarImagemDiretorio():

public ImageIcon recuperaImagemDiretorio() {

Connection conexao = null;

/**

Estabelea a conexao

*/

Statement declaracao = null; ResultSet resultado = null; StringBuffer sql = new StringBuffer(); sql.append("SELECT imagem FROM tabelaTeste2 WHERE codigo = 1"); ImageIcon imagem = null; try { declaracao = conexao.createStatement(); resultado = declaracao.executeQuery(sql.toString()); if (resultado.next()) {

String caminhoImagem = resultado.getString("imagem");

if (caminhoImagem!=null){ imagem = new ImageIcon(caminhoImagem); }

} } catch (SQLException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } return imagem; }

Concluso
Vimos como pode ser fcil realizar UpLoads de imagem para um servidor, seja para um campo Blob ou para um diretrio qualquer tambm no servidor.

A utilizao de qualquer um desses mtodos vai depender de suas decises de projeto analisando qual ser a melhor e mais vivel alternativa.

A recuperao destas imagens pode ser utilizada, por exemplo para exibies em relatrios (conforme mostrei em artigos anteriores), exibio de paginas personalizadas de usurios do sistema, dentre outras.

Espero que todos tenham gostado deste tutorial e tirado o maior proveito dele.

Um abrao. At a prxima!

You might also like