elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Subir archivos con Servlet
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Subir archivos con Servlet  (Leído 2,077 veces)
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Subir archivos con Servlet
« en: 6 Julio 2015, 00:20 am »

Subir archivos en Java es realmente muy sencillo. Ya Java nos provee interfaces como Part para facilitarnos el trabajo. Veamos un ejemplo:

Vamos con nuestro sencillo formulario:


Código
  1. <h1>Subir archivos</h1>
  2.    <form method="post" action="upload" enctype="multipart/form-data">
  3.    <fieldset>
  4.     <legend>Formulario de subida</legend>
  5.     <input type="file" name="files" id="files" multiple/>
  6.        <button type="submit">Subir</button>
  7.    </fieldset>
  8. </form>

Como podemos observar no hay nada del otro mundo. Simplemente un input tipo file e indicamos que se podrán elegir múltiples archivos. Por últmo, el botón submit.


Servlet

Nuestro servlet será como cualquier otro, pero añadiremos la anotación @MultipartConfig, que básicamente, identificará el servlet como un servlet multipart/form-data.

Código
  1. @WebServlet(name = "UploadServlet", urlPatterns = {"/upload"})
  2. @MultipartConfig(location="D:/uploads")
  3. public class UploadServlet extends HttpServlet {
  4.    private static final long serialVersionUID = 1L;
  5.  
  6.    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
  7.            throws ServletException, IOException {
  8.        response.setContentType("text/html;charset=UTF-8");
  9.        Collection<Part> parts = request.getParts();
  10.        for(Part part : parts) {
  11.         part.write(getFileName(part));
  12.        }
  13.    }
  14.  
  15.    @Override
  16.    protected void doGet(HttpServletRequest request, HttpServletResponse response)
  17.            throws ServletException, IOException {
  18.        processRequest(request, response);
  19.    }
  20.  
  21.    @Override
  22.    protected void doPost(HttpServletRequest request, HttpServletResponse response)
  23.            throws ServletException, IOException {
  24.        processRequest(request, response);
  25.    }
  26.  
  27.    public String getFileName(Part part) {
  28.        String contentHeader = part.getHeader("content-disposition");
  29.        String[] subHeaders = contentHeader.split(";");
  30.        for(String current : subHeaders) {
  31.            if(current.trim().startsWith("filename")) {
  32.             int pos = current.indexOf('=');
  33.                String fileName = current.substring(pos+1);
  34.                return fileName.replace("\"", "");
  35.            }
  36.        }
  37.        return null;
  38.    }
  39. }

El atributo location sirve para especificar la ruta donde se guardarán los archivos recibidos. Ésto porsupuesto puede hacerse desde código también. En mi caso, he decidido guardarlas en D:/uploads.

Primero, recibimos todos los part mediante el método getParts() del objeto HttpServletRequest. Cada part viene a ser una parte que representa a cada elemento enviado. El payload de la petición se ve así:

Código
  1. ------WebKitFormBoundaryKZUc66kZeBth3nDc
  2. Content-Disposition: form-data; name="files"; filename="jsf-scopes.png"
  3. Content-Type: image/png
  4.  
  5.  
  6. ------WebKitFormBoundaryKZUc66kZeBth3nDc
  7. Content-Disposition: form-data; name="files"; filename="navbar.png"
  8. Content-Type: image/png

Donde Content-Disposition y Content-Type son las cabeceras de las peticiones por cada part (elemento) enviado.  Es importante saber la anatomía de éstas peticiones, porque luego las usaremos para obtener ciertos datos,  como el nombre de los archivos.

Luego, recorremos los parts y por cada uno de ellos, obtenemos su nombre llamando al método getFileName el cual recibe un part y devuelve el nombre del archivo/elemento al que corresponde:

Código
  1. public String getFileName(Part part) {
  2.        String contentHeader = part.getHeader("content-disposition");
  3.        String[] subHeaders = contentHeader.split(";");
  4.        for(String current : subHeaders) {
  5.            if(current.trim().startsWith("filename")) {
  6.             int pos = current.indexOf('=');
  7.                String fileName = current.substring(pos+1);
  8.                return fileName.replace("\"", "");
  9.            }
  10.        }
  11.        return null;
  12.    }

Primero obtenemos la cabecera content-disposition la cual como vimos, almacena los datos del elemento enviado. Ahora, obtenemos los datos de esa cabecera y les llamaremos subHeaders. Los obtenemos diviendo el contenido de la cabecera por puntos y comas (;) porque así está formada la petición.

En éste punto ya tenemos los siguientes datos:

  • form-data
  • name
  • filename

El que nos interesa es filename ya que éste almacena el nombre del archivo enviado. Comprobamos si la subHeader actual comienza con 'filename', si es así,  obtenemos la posición del caracter '=' para obtener todo lo que hay hacia la derecha, que es lo que nos interesa: el nombre del archivo. Por último, reemplazamos las comillas por nada (eliminar) y eliminamos los espacios en blanco al inicio/final del nombre del archivo. El resultado, el nombre del archivo solamente.

Una vez que obtenemos el nombre del archivo asociado a cada part, los escribimos en el directorio especificado por el atributo location, que será D:/uploads:

Código
  1. part.write(getFileName(part));

Por último, verificamos si se han subido  los archivos:



Eso es todo. ¿Quién dijo que Java es difícil? :P


En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Subir archivos con Servlet
« Respuesta #1 en: 6 Julio 2015, 11:48 am »

Que grande Gus, gracias por el aporte ^^


En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Subir archivos con Servlet
« Respuesta #2 en: 6 Julio 2015, 15:34 pm »

Go go go Baal, ya te falta poco para dar el salto a Java EE!. Sigue estudiando bro.
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Subir archivos a un ftp « 1 2 3 »
Programación Visual Basic
RED_HORSE 22 7,831 Último mensaje 28 Abril 2006, 01:40 am
por RED_HORSE
Subir archivos...
Programación Visual Basic
sp26 2 1,882 Último mensaje 30 Diciembre 2006, 12:46 pm
por skapunky
Subir archivos
PHP
zhynar_X 3 2,523 Último mensaje 10 Agosto 2007, 03:46 am
por дٳŦ٭
subir archivos via php
PHP
deopoldo 4 5,148 Último mensaje 8 Julio 2009, 06:26 am
por дٳŦ٭
Problema con servlet y jsp: error 404
Java
Theeixe 0 2,446 Último mensaje 25 Agosto 2016, 02:23 am
por Theeixe
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines