viernes, junio 27, 2008

[Java] File Upload servlet


Aqui les dejo una version actualizada del código para java servlet de "file upload".
Colocaré los pasos exactos que yo segui para que el ejemplo funcione.



 ____________________________________________________________________________
En principio, utilice Netbeans 6 y tomcat 6 para este ejemplo.

1. Obterner la librería "Commons IO" (ver 1.4) de :

http://commons.apache.org/io/

2. Obtener la librería "commons file upload" (en este caso bajé la ver 1.2.1 de enero del 2008).

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

3. Ambas descomprimirlas en una carpeta "c:/librerias"

4. Crear un proyecto nuevo llamado "FileUpload"
Notar que se selecciono "Tomcat 6" como application server.


5. Crear un html nuevo llamado "uploadFile"



Colocar en el nuevo html el siguiente código:




<HTML>


<HEAD>


<TITLE></TITLE>


</HEAD>


<BODY>


<center>


<form method="POST" enctype='multipart/form-data'


action="/FileUpload/UploadFichero">


Seleccione el archivo a enviar al servidor<br>


<input type="file"


name="fichero">


<input type="submit" value="Upload">


</form>


</center>


</BODY>


</HTML>



6. Agregar las librerias que se descomprimieron en el archivo "c:/librerias"


Se agregarán todas las librerias "commons file upload"

y se agregaran todas las librerias "commons IO"

Todas las librerias deberían verse así en el entorno:

7. Se crea un nuevo paquete, llamado org.txos

8. Se crea un nuevo servlet llamado "UploadFichero"

9. Colocar el siguiente código en el servlet:





/*


* UploadFichero.java


*


* Created on 27-06-2008, 11:22:00 AM


*


* To change this template, choose Tools | Templates


* and open the template in the editor.


*/
package org.txos;


import java.io.*;


import java.net.*;


import javax.servlet.*;


import javax.servlet.http.*;


import org.apache.commons.fileupload.*;


import org.apache.commons.fileupload.disk.DiskFileItemFactory;


import org.apache.commons.fileupload.servlet.ServletFileUpload;


import java.util.*;


/**


*


* @author Os


*/


public class UploadFichero extends HttpServlet {


/**


* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.


* @param request servlet request


* @param response servlet response


*/


protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


boolean ok = getNSaveFile(request);


response.setContentType("text/html");


PrintWriter out = response.getWriter();


out.println("");


out.println("");


out.println("");


out.println("");


out.println("");


if (ok) {


out.println("La transferencia del archivo fue exitosa.");


} else {


out.println("Fallo en transferencia de archivo.");


}


out.println("");


out.println("");


out.close();


}


public boolean getNSaveFile(HttpServletRequest request) {


try {


// Chequea que sea un request multipart (que se este enviando un file)


boolean isMultipart = ServletFileUpload.isMultipartContent(request);


System.out.println("Is multipart=" + isMultipart);


DiskFileItemFactory factory = new DiskFileItemFactory();


// maxima talla que sera guardada en memoria


factory.setSizeThreshold(4096);


// si se excede de la anterior talla, se ira guardando temporalmente, en la sgte direccion


factory.setRepository(new File("d:/"));


ServletFileUpload upload = new ServletFileUpload(factory);


//maxima talla permisible (si se excede salta al catch)


upload.setSizeMax(10000000);


List fileItems = upload.parseRequest(request);


//obtiene el file enviado


Iterator i = fileItems.iterator();


FileItem fi = (FileItem) i.next();


//graba el file enviado en el servidor local


//path y Nombre del archivo destino (en el server)


String path = "c:/";


String fileName = "nuevo.txt";


fi.write(new File(path, fileName));


} catch (Exception e) {


System.out.println(e.getMessage());


e.printStackTrace();


return false;


}


return true;


}


@Override


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


processRequest(request, response);


}


/*


* Handles the HTTP POST method.


* @param request servlet request


* @param response servlet response


*/


}

10. Hacer "Build" al código del proyecto

11. Correrlo....
12. Se mostrará inicialmente el jsp.index, cambiar el path en el browser a:

13. Se deberá ver una página de este estilo:

14. Buscar un archivo cualquiera, preferentemente .txt y subirlo... se verá la siguiente página:

15. Buscar el archivo "subido" en c:/nuevo.txt.

16. Fin.



xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

9 comentarios:

  1. Hola, realice todos los pasos (en eclipse ide), pero al momento de subir los archivos tengo 2 problemas, el primero es que no todos los archivos lo sube, no se si deba tener ciertas caracteristicas el archivo:S ? y segundo que despues que si sube alguno lo deja como un archivo temporal en la ruta destino, aunque al parecer si esta completo porque si mide lo mismo que el original. Agradeceria mucho la ayuda para saber porque podria estar pasandome eso:)!!

    Muchas Gracias!!

    ResponderBorrar
  2. hola =D bueno estuve intentando hacer la preuba pero no puedo descargar las librerias :S espero que nos puedas ayudar por favor!!!

    y soy de cocha ^^

    ResponderBorrar
  3. re:Anonimo,
    Podrias decirme en que clase de archivos (especificamente) te ocurren esos problemas?

    ResponderBorrar
  4. re: princesita feliz,
    ...Algo dificil ayudarte con el tema de las librerias...
    Sugerencias?

    ResponderBorrar
  5. PE:
    Disculpen la tardanza en las respuestas, pero estuve lejos de mi maquina por un tiempo.

    ResponderBorrar
  6. Hola muchas gracias por el codigo, aunque a mi no me funciona, realize paso a paso pero al momento de enviar la consulta me genera el siguiente error:

    java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
    org.apache.commons.fileupload.servlet.ServletFileUpload.isMultipartContent(ServletFileUpload.java:68)
    servlet.UploadFichero.getNSaveFile(UploadFichero.java:53)
    servlet.UploadFichero.processRequest(UploadFichero.java:32)
    servlet.UploadFichero.doPost(UploadFichero.java:81)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)

    ¿QUE PUEDE SER? Gracias

    ResponderBorrar
  7. Estimado Oscar estupendo instrutivo, me has sido de mucha ayuda, todo me a funcionado a las mil maravillas. :-) gracias brother.

    para enrriqueser algo el codigo, si cambian la intrucion

    String fileName = "nuevo.txt";

    por

    String fileName = fi.getName();

    ..los archivos conservan sus nombre originales y asi no se afectan al ser creados en el path.

    ResponderBorrar
  8. compañero me trabaja perfecto el upload unicamente queria consultar si es posible decirle al upload que solo permita subir archivos con extension PDF y que los demas no los permita?

    alfagactor: proble colocar
    fi.getName(); en lugar de como estaba pero me da error y no me genera el archivo x sus comentarios, gracias.

    ResponderBorrar
  9. Que tal muchas gracias por aporte me ha servido de mucho

    ResponderBorrar

java.net.SocketException: Software caused connection abort: socket write error

JAVA : Utilizando la librería " org.apache.commons.net.ftp ", encontré que al listar los archivos del servidor FTP se generaba...