Commons File Upload

julio 15, 2008

Por cuestiones de trabajo, he tenido hacer una pequeña aplicación Web que carga un archivo plano separado por comas y carga sus registros en una base de datos.

Pues he utilizado una librería de Apache Commons llamada File Upload, la cual nos provee de de un framework mas avanzado para el manejo de archivos.

Bueno hasta ahora la he comenzado a utilizar entonces pondré en este post los pasos que he hecho para que me funcione.

Primero descargué la librería de File Upload de aqui, y luego descargue la librería Commos.io de Apache la cual es necesaria para FileUpload.

Luego las pongo dentro de la carpeta WEB-INF/lib.

Basicamente he creado una página con un formulario, un File Input y un boton de Submit. y un Servlet que será el encargado de procesar el archivo.

La Página:

<form name="form1" action="cargarservlet" method="post"
              enctype="multipart/form-data">
      <input type="file" name="archivo"/>
      <input type="submit" name="enviar" value="enviar"/>
    </form>

Es muy importante que tengamos encuenta que el formulario debe tener como metodo a usar POST  y el tipo de encripción debe ser “multipart/form-data” esto es necesario para poder hacer el upload de archivos.

Ahora el Servlet

incluimos las librerias necesarias para File Upload

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

y en el el metodo doPost ponemos el codigo necesario para procesar el archivo.

Gracias a FileUpload podemos hacer una verificación para saber si en el contenido enviado vienen datos multipar o y así saber como tratar el request.

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

Ahora creamos los objetos para procesar el archivo

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

List  items = upload.parseRequest(request);

En donde items es un arreglo de objetos FileItem.

ahora nos resta recorrer el arreglo item para procesar cada uno de los archivos cargados.

Iterator iter = items.iterator();
while (iter.hasNext())
{
  FileItem item = (FileItem) iter.next();

  if (item.isFormField())
  {
    // aqui va el codigo si el objeto no es un archivo
   // sino un campo del formulario

  }
  else
  {

// Empezamos a leer las propiedades del archivo

String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();

InputStream data = item.getInputStream();

DataInputStream in = new DataInputStream(data);

BufferedReader br = new BufferedReader(new InputStreamReader(in));

 

// Leemos linea a linea el archivo.

while ((line = br.readLine()) != null)
{
  st = new StringTokenizer(line, ";");
  System.out.println("ARCHIVO *** :" + line);
}
br.close();

}

Esta funcionalidad nos permite leer el archivo y tenerlo en memoria mientras lo guardamos en una base de datos.

Aqui lo que hacemos es procesar la linea y separar sus columnas, segun nuestra definición y luego guardarlas en las tablas de base de datos correspondientes.

Pero igual si nuestro objetivo no es solo leer el archivo sino guardar el archivo fisico en el filesystem del servidor entonces lo que hay que hacer es volcar el contenido utilizando:

item.write(new File(“ruta del archivo”));

Bueno esta era solo una pequeña introducción al tema, si les interesa utilizarlo y llegar mas al fonde de esta librería pueden consultar la dirección oficial y su guía de  uso.

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

Gracias por la atención, si tienes comentarios  no dudes en hacerlos, igual estamos para ayudarnos.

Anuncios

3 Responses to “Commons File Upload”

  1. omar Says:

    hola, el ejm me sirvio de gran ayuda y esta bueno, mas bien tengo un problema parecido y quisiera saber si hay alguna solucion para esto, tengo q hacer una aplicacion donde el servidro tiene q tener acceso a un directorio del cliente si q el cliente interactue, ya tendria la ruta en el servidor del directorio del cliente solo quisiera saber si hay un framework q permita esto, tiene q ser de manera transparente para el cliente, con la libreria commons fileupload el cliente siempre tiene q interactuar, hay alguna manera para q pueda hacer esto sin q el cliente intervenga

  2. D Says:

    Hola Omar, los navegadores actuales, por seguridad no permiten que ninguna pagina tenga acceso ninguna carpeta del cliente mientras este no autorice manualmente. la solucion que se me ocurre es crear una aplicacion de escritorio que corra con el java web start y que esta aplicacion si sea la que envia el archivo al servidor.

    En una ocacion tambien debía enviar un archivo desde el cliente a un servidor, sin que el cliente interactuara, y lo que hice fue crear un archivo.bat en windows y enviar el archivo por ftp a la ruta. y luego cree una tarea programada de windows para que ejecutara el .bat cada 12 horas.

    Espero te sirva mi respuesta y disculpa por la demora en la respuesta. es que estamos cambiando este blog a su nueva direccion que es http://codeline.ritbox.com

  3. Charly Says:

    Ey! que buena onda el compartir conocimientos como estos, deberás que se agradece que halla gente que le gusta compartir conocimientos =D

    Saludos


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: