jueves, 12 de agosto de 2010

Upload de archivos con javax.servlet.http.Part con Servlet 3.0

Para este ejemplo estoy usando Ubuntu 10.04, Netbeans 9 y Glassfish V3
Para hacer un upload de archivo ya no es necesario usar librerias externas como common file-upload de Apache ya que desde la versión 3 de Servlets ya contamos con funcionalidad que nos permite hacer upload de archivos:

Primeramente creamos un proyecto web.Luego creamos archivo de texto con cualquier contenido en cualquier lugar de nuestro disco duro, para mi caso el archivo se llama archivo.txt. El archivo tiene el siguiente contenido:

Esta es una prueba de un archivo que se encuentra en disco

Luego creamos un servlet de la siguiente manera

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.ejemplo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**
*
* @author santiago
*/
@WebServlet(name = "Upload", urlPatterns = {"/Upload"})
@MultipartConfig(location = "/tmp")
public class Upload extends HttpServlet {

/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
Part p = request.getPart("desc");
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String desc = r.readLine();
request.setAttribute("desc", desc);
p.write("browser.txt");
p = request.getPart("data");
p.write("DATAFILE");
RequestDispatcher rd = request.getRequestDispatcher("mensaje.jsp");
rd.forward(request, response);
} finally {
out.close();
}
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}

Quiero destacar el uso de la anotación:
@MultipartConfig(location = "/tmp") que es usada para especificar en que lugar de nuestro disco duro guardaremos la información.

Ahora creamos una pagina JSP que en el action del formulario(que es multipart) llamará al Servlet antes creado:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<form name="form1" action="Upload" enctype="multipart/form-data" method="post">
Description:<input type="text" name="desc"/>
File:<input type="file" name="data"/>
<input type="submit" value="Click"/>
</form>
</body>
</html>


Luego creamos una pagina para indicar que se subio el archivo, llamada mensaje.jsp, con el siguiente código
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Archivos Subidos y creados</h1>
</body>
</html>

Si ejecutamos la página JSP, ingresamos algo en la caja de texto y subimos un archivo:


Vemos que se nos han creado dos archivos uno con el contenido del archivo que subimos y otro archivo con lo que escribimos en la caja de texto


3 comentarios:

  1. muchas gracias por el aporte camarada, estaba quemandome el coco con las librerias de upload de apache namas q tenia algunos problemas, pero gracias por el aporte...

    ResponderEliminar
  2. Que gran aporte, pensaba que era necesario usar las bibliotecas org.apache.commons.***, gracias por la ayuda me sirvio de mucho.

    ResponderEliminar
  3. muy bueno. pero tengo otra duda como guardarlo y recuperarlo desde la base de datos

    ResponderEliminar