Professional Documents
Culture Documents
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.
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
<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; ">
</form>
Criando o Servlet
Agora vamos criar um Servlet para receber esta requisio:
//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. }
CREATE TABLE TabelaTeste ( codigo imagem ); INT UNSIGNED NOT NULL, BLOB NOT NULL
/** * @param item FileItem, representa um arquivo que enviado pelo formulario * MultiPart/Form-data * @throws IOException * @throws ServletException */ private void inserirImagem(FileItem item) {
/**
Estabelea a conexo
*/
try { declaracao = conexao.prepareStatement(sql); declaracao.setInt(1, 1); // codigo 1 declaracao.setBinaryStream(2, item.getInputStream(), (int) item.getSize() ); declaracao.executeUpdate();
A seguir, o mtodo recuperaImagem() mostra como fazer para recuperar esta imagem que foi inserida no Banco de Dados.
/**
Estabelea a conexao
*/
Statement declaracao = null; ResultSet resultado = null; StringBuffer sql = new StringBuffer(); sql.append("SELECT imagem FROM tabelaTeste WHERE codigo = 1");
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; }
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:
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
// 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;
/**
Estabelea a conexo
*/
";
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(); } }
/**
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()) {
} } 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!