Procuremos más ser padres de nuestro porvenir que hijos de nuestro pasado.
Miguel de Unamuno

[Struts] - Subir un fichero al servidor

Requisitos 

Es normal que en algunas aplicaciones web se permita subir/eliminar archivos al servidor. Por ejemplo, subir la foto del empleado en un portal corporativo a un directorio de fotos, o a un directorio personal del usuario que sube la foto.

En la práctica es necesario tener ciertas restricciones, como un tamaño máximo de archivo. 

Partiremos de una aplicación implementada con Struts, aunque sería muy similar en servlets y portlets.

Herramientas

Para gestionar ficheros transmitidos en la request ya existen herramientas suficientemente estables, como las utilidades del proyecto Commons FileUpload de http://www.apache.org. Podremos obtener las fuentes, los archivos binarios y documentación como la guía del usuario. En este ejemplo utilizaremos la librería commons-fileupload-1.2.jar obtenida de este proyecto.

Además, este proyecto necesita también el proyecto Commons IO, por lo cual utilizaremos también commons-io-1.3.1.jar.

Implementación en el cliente

En la parte del cliente, nuestro formulario deberá de ser capaz de transmitir en la request el contenido del archivo que queremos subir al servidor, y por tanto debe de codificar sus datos en la request de una forma diferente a la habitual, como "multipart".

Además, para subir un fichero debemos utilizar un campo del tipo "file", que permitirá al usuario explorar para seleccionar el fichero que quiere subir. 

<html:form action="/adjuntarFichero"  method="POST" enctype='multipart/form-data' >
    <html:file property='ficheroSubir' />
</html:form>

Implementación en el servidor

Si vamos a utilizar Struts, además de sus librerías debemos añadir al classpath de nuestra aplicación (típicamente /WebContent/WEB-INF/lib) las dos librerías que vamos a utilizar: commons-upload.jar y commons-io.jar. 

Debemos declarar en nuestro formulario una variable del tipo FormFile con el nombre de la propiedad del tipo file que hemos declarado en el fichero jsp.

private FormFile ficheroSubir;

De esta forma, en nuestro Action podremos acceder tanto al nombre del fichero, como a su tipo, tamaño y datos.

        FormFile formFile = formulario.getTheFile();
        String contentType = formFile.getContentType();
        String fileName    = formFile.getFileName();
        int fileSize       = formFile.getFileSize();
        byte[] fileData    = formFile.getFileData();

A tener en cuenta: 

  • Struts nos permite realizar subidas de ficheros al servidor fácilmente como hemos visto, pero también podemos utilizar las clases de la librería commons-upload. 
  • SizeThreshold, nos indica el tamaño a partir del cual los ficheros son almacenados en un directorio local del disco duro del servidor, en lugar de manejarlo en la memoria RAM. Este fichero no es eliminado automáticamente a posteriori por la librería Commons FileUpload.

Technorati Tags: , ,

5 Comentarios hasta el momento »

  1. Angel dijo

    27 de May del 2008 a las 6:43 pm

    Hola, un pregunta, como debo de configurar el archivo struts-config.xml, lo que sucede es que

    donde uploadAction es mi class
    y upload lo coloco en el form de esta forma

    Pero me aperece el error. Cannot retrieve definition for form bean null on action /upload
    Y no se que hacer, espero me puedan ayudar, muchas gracias.

  2. yoyoooyoy dijo

    29 de May del 2008 a las 8:50 am

    Gracias por tu comentario.

    Sí, es cierto que lo del struts-config no está especialmente bien explicado. Lo que quiero decir es que tú creas un formulario (ActionForm) y un action como siempre, y los declaras en el struts-config.xml normalmente. Únicamente debes recordar el el action del jsp (en el artículo

  3. asile dijo

    3 de June del 2008 a las 8:20 pm

    Hola! quería preguntaros una cosa. Yo he usado ese ejemplo para subir fotos al servidor, pero ahora tengo la siguiente duda.
    Tengo un formulario para dar de alta productos (guardarlos en la base de datos) y quiero tener un nombre y una imagen (guardare en la base de datos la ruta de la imagen) pero no soy capaz de que el formulario me funcione con el y con el fileUpload
    alguna solucion?
    Muchas gracias!

  4. DeDoMedio dijo

    17 de December del 2008 a las 11:06 pm

    Gracias, no sabes cuanto no me a ayudado tu portal…

    sigue asi…. :)

  5. yoyoooyoy dijo

    19 de December del 2008 a las 11:48 am

    @asile, no recuerdo tu comentario, supongo que ya no necesitarás una solución pero si es así ponte en contacto conmigo para que me detalles algo más y veremos qué se puede hacer.

    @DeDoMedio, muchas gracias, es agradable que todo este esfuerzo sirva a algien, especialmente estos días que están resultando tan complicados.

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

Comenta