Upload de ficheros en Java

8
173673

FileUpload: Subida de Ficheros al Servidor

Cuando realizamos una aplicación Java, es posible que tengamos la necesidad de
crear un sistema de administración, normalmente en la Intranet, para
simplificar las labores de mantenimiento.

Esta administración, posiblemente estará formada por unos cuantos formularios,
normalmente interactuará con una base de datos…. pero a veces, también
tenemos la necesidad de subir ficheros al servidor.

Para subir un fichero al servidor, debemos crear un formulario un poco
especial… via POST e indicando que es una subida multi-parte.

<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<center>
<form method=»POST»
enctype=’multipart/form-data’ action=»/servlet/uploadFichero«>
Por favor, seleccione el trayecto del fichero a cargar
<br><input type=»file» name=»fichero»>
<input type=»submit»>
</form>
 
</center>
</BODY>
</HTML>

En el formulario anterior, podemos ver que vamos a subir la respuesta a un
servlet llamado uploadFichero… este es el aspecto del formulario.

En otro tutorial, vimos
como crear un servidor Web
…. si atacasemos a nuestro servidor (cambiando
el destino de nuestro formulario),
obtendriamos una respuesta como ésta…. con ello nos hacemos una idea de lo que
el servidor se encuentra:

Thread[Thread-1,4,main] - --POST / HTTP/1.1-
Thread[Thread-1,4,main] - --Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint,
application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*-
Thread[Thread-1,4,main] - --Referer: http://localhost:8081/formularioUpload.html-
Thread[Thread-1,4,main] - --Accept-Language: es-
Thread[Thread-1,4,main] - --Content-Type: multipart/form-data; boundary=---------------------------7d31df1ed049a-
Thread[Thread-1,4,main] - --Accept-Encoding: gzip, deflate-
Thread[Thread-1,4,main] - --User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)-
Thread[Thread-1,4,main] - --Host: localhost:90-
Thread[Thread-1,4,main] - --Content-Length: 325-
Thread[Thread-1,4,main] - --Connection: Keep-Alive-
Thread[Thread-1,4,main] - --Cache-Control: no-cache-
Thread[Thread-1,4,main] - ---
Thread[Thread-1,4,main] - -------------------------------7d31df1ed049a-
Thread[Thread-1,4,main] - --Content-Disposition: form-data; name="fichero"; filename="C:\Leeme.txt"-
Thread[Thread-1,4,main] - --Content-Type: text/plain-
Thread[Thread-1,4,main] - ---
Thread[Thread-1,4,main] - --Este es un ejemplo de un fichero que vamos a tratar de hacer el upload.-
Thread[Thread-1,4,main] - --Para ello, trataremos de simplificar la labor al máximo-
Thread[Thread-1,4,main] - ---
Thread[Thread-1,4,main] - ---
Thread[Thread-1,4,main] - -------------------------------7d31df1ed049a---

Es decir ….. vemos que es servidor es capaz de recibir una respuesta y
nosotros en nuestro servlet debe hacer lo mismo.

Ahora, tenemos que crear un servlet que sea capaz de procesar la
respuesta….

La labor … no parece demasiado sencilla …. aunque siempre hay alguien que
nos facilitará la tarea ….

En este caso …. hay un subproyecto en apache http://jakarta.apache.org/commons/fileupload/

que nos proporciona las clases para que nuestro trabajo sea mínimo:

Nos descargamos el jar (no olvidar incluirlo en el classpath). Si os falla este proyecto…. seguro que es por ésto.

Solamente tenemos que escribir un código mínimo

/*
 * uploadFichero.java
 *
 * Created on 4 de agosto de 2003, 22:26
 */

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.commons.fileupload.*;
import java.util.*;
/**
 *
 * @author  Roberto Canales
 * @version
 */
public class uploadFichero extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet</title>");
        out.println("</head>");
        out.println("<body>");

        System.out.println("Comenzamos procesamiento ficheros");

        procesaFicheros(request,out);

        out.println("</body>");
        out.println("</html>");

        out.close();
    }


    void depura(String cadena)
    {
        System.out.println("El error es " + cadena);
    }

    public boolean procesaFicheros(HttpServletRequest req, PrintWriter out ) {
        try {
            // construimos el objeto que es capaz de parsear la perición
            DiskFileUpload fu = new DiskFileUpload();

            // maximo numero de bytes
            fu.setSizeMax(1024*512); // 512 K

            depura("Ponemos el tamaño máximo");
            // tamaño por encima del cual los ficheros son escritos directamente en disco
            fu.setSizeThreshold(4096);

            // directorio en el que se escribirán los ficheros con tamaño superior al soportado en memoria
            fu.setRepositoryPath("/tmp");

            // ordenamos procesar los ficheros
            List fileItems = fu.parseRequest(req);

            if(fileItems == null)
            {
                depura("La lista es nula");
                return false;
            }

            out.print("<br>El número de ficheros subidos es: " +  fileItems.size());

            // Iteramos por cada fichero
	    Iterator i = fileItems.iterator();
            FileItem actual = null;
            depura("estamos en la iteración");

            while (i.hasNext())
            {
                actual = (FileItem)i.next();
                String fileName = actual.getName();
                out.println("<br>Nos han subido el fichero" + fileName);

                // construimos un objeto file para recuperar el trayecto completo
                File fichero = new File(fileName);
                depura("El nombre del fichero es " + fichero.getName());

                // nos quedamos solo con el nombre y descartamos el path
                fichero = new  File("c:\\ficherossubidos\\" + fichero.getName());

                // escribimos el fichero colgando del nuevo path
                actual.write(fichero);
            }

        }
        catch(Exception e) {
            depura("Error de Aplicación " + e.getMessage());
            return false;
        }

        return true;
    }

    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
}

El resultado es impresionante .. en el directorio que hemos seleccionado….
tenemos el fichero que hemos solicitado ….. y nos a costado apenas unas
lineas…

En proximos tutorial os hablaremos de otras de las APIS que están disponibles
en apache ….

Sobre el
Autor ..

8 COMENTARIOS

  1. hola podrian ayudarme a hacer funcionar este ejemplo hago lo siguiente:

    1.- genero el formulario y lo guardo en un jsp
    2.- depues bajo las librerias y las integro a mi proyecto y en el class pad
    3.- genero un archivo .java en el cual copio el codigo correspondiente indicado en esta pagina
    4.- al correr el archivo me dice que el error de que el recurso no esta disponible como en los mensaje anteriores del foro .

    5.- yo trabajo con apache 6.02 no se si tenga que ver y los jars que baje son del common.io el 1.3.2 y de uploadfile el 1.2.1

    Podrian ayudarme por favor o bien explicarme en que tipo de archivos tengo que introducir el codigo yo necesito un jsp que suba archivos no se si me puedan hacer el favir de orientarme.

    muchas gracias espero su pronta respuesta.

  2. Hola!!! Estoy aprendiendo java y solo quiero agradecer por este tutorial, ojala me puedan mandar información sobre este y mas temas relacionados con java para así aprender mas. Gracias…

  3. Quisiera saber si puedo enviar además del archivo otros campos. Por ejemplo que la pagina tenga algo como esto:

    Por favor, seleccione el trayecto del fichero a cargar

    Mi pregunta es esto se puede hacer y si se puede de que manera porque lo he intentando y los text me los devuelve null.
    De verdad que necesito de su ayuda. Gracias.
    lshg01@gmail.com

  4. creo que cometí un error al colocar el código:
    bueno deseo que además de enviar el archivo también se puedan enviar campos de texto, a través de post o a través de guet, lo he intentado de mil y un maneras o me devuelve null los campo o no me genera el archivo. gracias…

    lshg01@gmail.com

  5. disculpa gracias por el aporte pero mi pregunta es si esta aolicacion tambien puede funcionar para I2(Consorcio sin fines de lucro que desarrolla tecnologías de redes de alta velocidad. Es una red de fibra óptica desarrollada principalmente por universidades. Se esperan velocidades de 633 mbps para universidades, y 50 mbps para usuarios particulares)porfavor si me puedes ayudar de antemano muchas gracias mi mail es dragjohn@hotmail.com

  6. Buenos días

    Aqui se sube el fichero a traves de una jsp, pero si llamamos al servlet desde una aplicacion java, a traves de una url, como podemos pasar el fichero, teniendo en cuenta que tenemos desplegado el servlet en otra maquina distinta a la maquina en donde cojemos el fichero?

    Muchas gracias

    Un saludo

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad