4
 Upload de arquivos com Servlets Diogo Moreira [email protected] Este tutorial explica de forma simples como fazer um upload de arquivos utilizando Servlets e JSP com as bibliotecas Commons da Apache. Introdução Acredito que, assim como eu, muita gente deve ter tido essa dificuldade de achar material sobre upload de arquivos com servlets. Então, resolvi fazer o passo-a-passo sobre como fazer um upload de um arquivo qualquer e exibindo suas informações, porém esse tutorial se extende a qualquer tipo de upload, bastando apenas algumas modificações no código para tratar os arquivos de formas diferentes. Usarei a IDE Netbeans 7.0, mas não há nenhum recurso dela que não exista no Eclipse para este exemplo. Enquanto vai andando pelos primeiros passos, baixe as seguintes bibliot ecas: Commons IO e Commons FileUpload, serão necessárias numa etapa posterior. Estas bibliotecas fazem partes do Common da Apache, que tem o foco em componentes reutilizáveis em Java. Mais informações e outras bibliotecas em http://commons.apache.org/ Criando o projeto Crie um novo projeto web, de preferência utilize a especificação Servlets 3.0 que não necessita de mapeamentos em xml, se estiver utilizando uma versão anterior verifique se suas servlets estão mapeadas corretamentes no web.xml . Criando o formulário Crie uma nova página jsp, xhtml ou semelhante. Esta página vai conter o formulário que será necessário para o upload. A tag <form> terá o atributo enctype setado para "multipart/form-data" , isso porque o valor "application/x-www-form-urlencoded"  é ineficiente quando estamos tratando grandes quantidades de dados binários ou texto com caracteres não-ASCII. De forma geral, deve-se usar para formulários que vão enviar arquivos ou texto com caracteres não-ASCII. O formulário que criei para este exemplo é simples, contém apenas um campo que é do tipo <input> com o atributo type="file". A Figura 1 mostra o formulário que usei para este exemplo:

Upload de arquivo utilizando Servlets

Embed Size (px)

DESCRIPTION

Este artigo explica de forma simples como fazer um upload de arquivos utilizando Servlets e JSP com as bibliotecas Commons da Apache

Citation preview

Upload de arquivos com ServletsDiogo Moreira [email protected] Este tutorial explica de forma simples como fazer um upload de arquivos utilizando Servlets e JSP com as bibliotecas Commons da Apache.

IntroduoAcredito que, assim como eu, muita gente deve ter tido essa dificuldade de achar material sobre upload de arquivos com servlets. Ento, resolvi fazer o passo-a-passo sobre como fazer um upload de um arquivo qualquer e exibindo suas informaes, porm esse tutorial se extende a qualquer tipo de upload, bastando apenas algumas modificaes no cdigo para tratar os arquivos de formas diferentes. Usarei a IDE Netbeans 7.0, mas no h nenhum recurso dela que no exista no Eclipse para este exemplo. Enquanto vai andando pelos primeiros passos, baixe as seguintes bibliotecas: Commons IO e Commons FileUpload, sero necessrias numa etapa posterior. Estas bibliotecas fazem partes do Common da Apache, que tem o foco em componentes reutilizveis em Java. Mais informaes e outras bibliotecas em http://commons.apache.org/

Criando o projetoCrie um novo projeto web, de preferncia utilize a especificao Servlets 3.0 que no necessita de mapeamentos em xml, se estiver utilizando uma verso anterior verifique se suas servlets esto mapeadas corretamentes no web.xml.

Criando o formulrioCrie uma nova pgina jsp, xhtml ou semelhante. Esta pgina vai conter o formulrio que ser necessrio para o upload. A tag ter o atributo enctype setado para "multipart/form-data", isso porque o valor "application/x-www-form-urlencoded" ineficiente quando estamos tratando grandes quantidades de dados binrios ou texto com caracteres no-ASCII. De forma geral, deve-se usar para formulrios que vo enviar arquivos ou texto com caracteres no-ASCII. O formulrio que criei para este exemplo simples, contm apenas um campo que do tipo com o atributo type="file". A Figura 1 mostra o formulrio que usei para este exemplo:

Figura 1 - Pgina do formulrio de envio

Criando a servletImporte as bibliotecas commons-fileupload-x.x.jar e commons-io-x.x.jar para o classpath da sua aplicao (o x representa a verso da biblioteca). Com as bibliotecas no classpath e a pgina pronta para enviar os arquivos, vamos construir a Servlet que ir receber este arquivo e pode tanto guard-lo em um local (como uma pasta ou array no banco de dados) quanto apenas exibir algumas informaes sobre ele. Para este exemplo criei uma servlet chamada "RecebeUpload" e foi mapeada para "/RecebeUpload". A Figura 2 mostra o cdigo exemplo da servlet:

Figura 2 - Servlet

Na primeira linha criamos uma fbrica de itens (interface FileItem) para os arquivos que vem do upload: FileItemFactory factory = new DiskFileItemFactory(); Aqui temos um handler (ServletFileUpload) do upload de arquivos que receber a referncia da fbrica de itens (factory) para criar cada item de upload separadamente ao invs de um stream.

ServletFileUpload upload = new ServletFileUpload(factory); Agora que temos o handler para o upload de arquivos e conhecemos a fbrica que sabe como fabricar os objetos para cada item de upload separadamente, podemos obter uma lista (List) desses itens passando o objeto da requisio (HttpServletRequest) como parmetro no mtodo parseRequest: items = upload.parseRequest(request); Agora que temos uma lista de itens, podemos iterar sobre ela para tratar cada campo do formulrio de uma maneira nica Iterator iter = items.iterator(); while (iter.hasNext()) { //Faa o tratamento dos itens } Podemos ainda fazer uma verificao com um prprio mtodo da interface Item que nos diz se aquele item um campo de formulrio (um qualquer, por exemplo) ou um arquivo. if (item.isFormField()) { // Itens comuns de formulrio } else { //Aqui temos certeza que o campo um , ento temos acesso ao array de bytes do arquivo no upload byte[] arquivo = item.get(); } Neste exemplo, repassamos algumas informaes referentes ao item para exibio em uma pgina jsp. request.setAttribute("content", item.getContentType()); request.setAttribute("size", item.getSize()); request.getRequestDispatcher("exibearquivo.jsp").forward(request, response); Para tratar os campos de formulrio, simples: utilize os mtodos getFieldName() para pegar o nome do campo (atributo name de cada tag ); e getString() para obter o valor do campo, semelhante a utilizar request.getParameter(nomeDoCampo). Nota: foi utilizado a especificao Servlets 3.0, onde no necessrio o mapeamento das servlets no web.xml, certifique-se qual a verso que voc est trabalhando e, se necessrio, mapeie suas servlets no web.xml.

Exibindo informaesFeito isso, criei uma pgina para exibir as informaes que a servlet coloca na requisio nas linhas 37 e 38. A Figura 3 mostra o cdigo-fonte da pgina que foi utilizada.

Figura 3 - Pgina de exibio de informaes

Com isso, a servlet recebe arquivos de qualquer tipo e exibe informaes quanto ao seu tamanho em bytes e o tipo de contedo que foi enviado. possvel restringir os tipos que so enviados utilizando getContentType(); e fazendo uma verificao simples com String (ex: if(item.getContentType() != "image/jpeg")). Tambm possvel obter um array de bytes contendo as informaes enviadas pelo campo utilizando o mtodo get(); como mostrado no exemplo.

Refernciashttp://commons.apache.org/fileupload/using.html http://commons.apache.org/io/