Main

Mas de Mi

Endorfina

Software Libre

Archivos de Blog

Bueno ahora un tutorial sobre como manejar archivos subidos por el usuario con servlet's, la razón, no encontré mucha información actualizada sobre el tema.

Primero hay que bajar el API que nos brinda apache, la cual está el paquete org.apache.commons.fileupload esta API es necesaria ya que trae las clases que se usarán, probablemente a la hora de correrlo hará falta que bajen también org.apache.commons.io, ya que probablemente a la hora de correlo les lanze un ClassNotFoundException, estos dos paquetes deberían ponerlo dentro de WEB-INF/lib/ en el contexto de su aplicación. (nota: los archivos del enlace son un targezeta o un zip, según su gusto, con el javadoc de la API y un .jar con las clases, y si lo bajaron con código también el código, dentro de WEB-INF/lib/ y en el CLASSPATH del compilador deberán colocar el jar correspondiente a estas API's y no el targezeta, osea hay que descomprimirlo!)

Ahora importamos lo que necesitaremos: [code='Java'] import java.util.List; import java.util.Iterator; import java.io.File; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.*; import org.apache.commons.fileupload.servlet.*; [/code]

Ahora obtener el archivo es bastante simple, primero necesitamos un FileItemFactory, que es así como el handler, el cual como su nombre lo dice nos va a crear los FileItem asociados a la petición, en este caso instanciamos un DiskFileItemFactory el cual nos permite escribir el archivo en el disco dentro de algún directorio temporal en caso de que el archivo sea demasiado grande para tenerlo en memoria. [code='Java'] DiskFileItemFactory factory = new DiskFileItemFactory(); // indicamos el tamaño máximo en memoria que tendrán los archivos factory.setSizeThreshold(4096); // indicamos el directorio temporal que contendrá los archivos factory.setRepository(new File("tmp")); [/code]

Ahora por medio de ServletFileUpload es que parsearemos el contenido de la petición para "fabricar" los archivos contenidos en la petición. [code='Java'] ServletFileUpload upload = new ServletFileUpload(factory); // indicamos un tamaño máximo para los archivos upload.setSizeMax(1024 * 512); // parseamos y obtenemos los FileItems dentro de un List de objetos // FileItem apartir de la petición. List items = upload.parseRequest(request); // si, yo tampoco se por que no se les ocurrió retornar una // lista usando tipos genéricos unsure.png , chance por los pedacero que aún usan // versiones de Java menores a la 1.5 [/code]

Ahora iteramos la lista y procesamos los archivos y otros campos obtenidos por el form según el gusto de cada quien ejemplo, escribiendo el archivo en un directorio conocido en el servidor:

[code='Java'] Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next();

if (item.isFormField()) { String nombre = item.getFieldName(); String valor = item.getString(); out.println("

Campo normal

"); out.println("Nombre: " + nombre + "
"); out.println("Valor: " + valor + "
"); } else { String nombreDelCampo = item.getFieldName(); String nombreDelArchivo = item.getName(); String contentType = item.getContentType(); out.println("

Campo de Archivo

"); out.println("Campo: " + nombreDelCampo + "
"); out.println("Archivo: " + nombreDelArchivo + "
"); out.println("tipo: " + contentType + "
"); // Instanciamos el archivo a crear. File uploadedFile = new File("/home/kno/tomcat-dir/uploads/" + nombreDeArchivo); try { // Escribimos el contenido del archivo subido por el usuario // dentro del archivo que acabamos de instancia. item.write(uploadedFile); out.println("Archivo Creado!
"); } catch (Exception e) { out.println("Error: " + e.getMessage()); } } [/code]

Así de simple obviamente pueden hacer mas cosas, para mas info chequen el JavaDoc de la API, este tutorial es un resumen y traducción no oficial del que pueden encontrar en la página de la API, está interesante, pero en inglés pero es lo mas actualizado que encontré.

Acá les pongo el código completo: [code='Java'] import java.io.IOException; import java.io.PrintWriter;

import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Iterator; import java.io.File; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.*; import org.apache.commons.fileupload.servlet.*;

public class Prueba extends HttpServlet { final static long serialVersionUID = 999988881134L;

public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.println("

"); out.println("Seleccione los archivos a subir"); out.println("
"); out.println("
"); out.println("
"); out.println(""); out.println("
"); }

public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter();

if (ServletFileUpload.isMultipartContent( new ServletRequestContext(req))) { try { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); factory.setRepository(new File("/home/kno/tomcat-dir/tmp")); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(1024 * 512); List items = upload.parseRequest(req); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString(); out.println("

Campo normal

"); out.println("Nombre: " + name + "
"); out.println("Valor: " + value + "
"); } else { String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); out.println("

Archivo

"); out.println("Nombre: " + fieldName + "
"); out.println("Archivo: " + fileName + "
"); out.println("tipo: " + contentType + "
"); File uploadedFile = new File("/home/kno/tomcat-dir/" + "uploads/" + fileName); try { item.write(uploadedFile); } catch (Exception e) { out.println("Error: " + e.getMessage()); } } out.println("
"); } } catch (FileUploadException e) { out.println("Error: " + e.getMessage()); } } else { out.println("No se subió algún archivo."); } } } [/code]

Espero que les sirva como me hubiera servido a mi tongue.png , el código corre perfectamente en tomcat 5.5.20 corriendo sobre Java 1.6 compilado con un JDK 1.6, probablemente tengan problemas en caso de que el usuario de tomcat no tenga permiso de escritura sobre el directorio temporal y el directorio donde se guardarán los archivos, y recuerden colocar correctamente los los .jar en el CLASSPATH del compilador y en el de tomcat.

Actualizado.- al parecer el jaws me hizo un desmadre en el código unsure.png , seguro no les va a jalar muy chido que digamos si lo copian y pegan y compilan tal cual unsure.png , si quieren el código mándenme un correo a: himura.kno@gmail.com, y yo se los mando, si mandan un solo fwd o correo basura los bloqueo face-smile-big.png y no volveré a leer un solo mail suyo face-wink.png .

EOT

kno | Geek/Nerd, Desarrollo | 30 Enero, 3:06am
maricarmen, <mounstrigirl(at)gmaildotcom> / 18 Febrero, 8:57pm  
avatar

la informacion presentada es muy util, solo tiene un pequenio error, cuando se hace la instancia del archivo, se concatena el nombre del FileItem asociado al archivo que el usuario subio, con la ruta en donde queremos guardar el archivo; lo que provoca un error. Por ejemplo si yo como usuario subo el archivo C:/miArchivo.txt, a la hora de concatenar con la ruta que quiero guardar, digamos E:/, el nombre queda E:/C:/miArchivo.txt. Ese problema si que me dio dolor de cabeza por lo que es mejor primero hacer una instancia con el nombre que ya trae y luego hacer otra instancia ahora si con la ruta en la que queremos guardar concatenada con el nombre del archivo: String fileSeparator = System.getProperty("file.separator"); File uploadedFile = new File(fileName); uploadedFile = new File(dirDestino + nombreCarpeta + fileSeparator + uploadedFile.getName());

[ Responder (0) ]
gaming, <gaming(at)Hotmaildotcom> / 29 Septiembre, 10:21pm  
avatar

Buena lectura. Gracias por publicar

[ Responder (0) ]
Andres, <z_andres88(at)hotmaildotcom> / 22 Mayo, 10:47am  
avatar

Hola muchas gracias me ha servido mucho, pero como hago para que al momento de subir un archivo solo puedan hacerlo de un solo formato, por ejemplo solo .jpg Saludos ^^.

[ Responder (0) ]

Dejar un comentario









Fuentes XML de comentario: RSS | Atom

He estado escuchando:

Amigos

Hokum
Blen (flog)
Mi carnal
Mike79
Pau(mi hermana la loca)
Moy
Tonyto
Maur0
Luis Alberto
Rox

¿Quien soy?

Soy un tipo un tanto diferente al promedio, tal vez una especie de geek-nerd-freak, lo que mas me pasa es la ciencia ficción, la cultura japonesa tanto clásica como moderna, las computadoras, y todo lo que hay al rededos de estos 3 ejes, la neta soy chido, o al menos eso me gusta creer (pronto mas).

Endorfina

Categorías

Add to Technorati Favorites