Carga y descarga de archivos JSP
⚡ Resumen inteligente
La carga y descarga de archivos JSP son operaciones básicas de entrada y salida que permiten a una aplicación web recibir archivos de los usuarios y enviárselos de vuelta. Este recurso explica ambos flujos utilizando formularios de acción JSP, Apache Commons FileUpload y clases de servlet, con código completo y funcional.
Carga de archivos JSP
- Podemos cargar cualquier archivo usando JSP.
- Puede ser un archivo de texto, un archivo binario, un archivo de imagen o cualquier otro documento.
- Aquí, en el caso de cargar archivos, solo se utilizará el método POST y no el método GET.
- El atributo Enctype debe establecerse en multipart/form-data.
Ejemplo: usar la acción
En este ejemplo, estamos subiendo un archivo usando un objeto IO.
Archivo_acción.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Guru File</title> </head> <body> <a>Guru File Upload:</a> Select file: <br /> <form action="action_file_upload.jsp" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50" /> <br /> <input type="submit" value="Upload File" /> </form> </body> </html>
Action_file_upload.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="java.io.*,java.util.*, javax.servlet.*" %> <%@ page import="javax.servlet.http.*" %> <%@ page import="org.apache.commons.fileupload.*" %> <%@ page import="org.apache.commons.fileupload.disk.*" %> <%@ page import="org.apache.commons.fileupload.servlet.*" %> <%@ page import="org.apache.commons.io.output.*" %> <!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=ISO-8859-1"> <title>Guru File Upload</title> </head> <body> <% File file ; int maxFileSize = 5000 * 1024; int maxMemSize = 5000 * 1024; String filePath = "E:/guru99/data"; String contentType = request.getContentType(); if ((contentType.indexOf("multipart/form-data") >= 0)) { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(maxMemSize); factory.setRepository(new File("c:\\temp")); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax( maxFileSize ); try{ List fileItems = upload.parseRequest(request); Iterator i = fileItems.iterator(); out.println("<html>"); out.println("<body>"); while ( i.hasNext () ) { FileItem fi = (FileItem)i.next(); if ( !fi.isFormField () ) { String fieldName = fi.getFieldName(); String fileName = fi.getName(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); file = new File( filePath + "yourFileName") ; fi.write( file ) ; out.println("Uploaded Filename: " + filePath + fileName + "<br>"); } } out.println("</body>"); out.println("</html>"); }catch(Exception ex) { System.out.println(ex); } }else{ out.println("<html>"); out.println("<body>"); out.println("<p>No file uploaded</p>"); out.println("</body>"); out.println("</html>"); } %> </body> </html>
Explicación del código:
Archivo_acción.jsp
Code Línea 12-18: Aquí estamos creando un formulario con un campo de archivo, que subirá un archivo al servidor, y la acción se pasará a action_file_upload.jsp.
Action_file_upload.jsp
Code Línea 20: Aquí estamos indicando la ruta del archivo a una ruta específica.
Code Línea 23-38: Aquí verificamos si el tipo de contenido es multipart/form-data. Si es así, el contenido es de tipo archivo y se lee. Una vez leído, el archivo se escribe en un archivo temporal, que luego se convierte en el archivo principal.
Cuando ejecuta el código anterior, obtiene el siguiente resultado:
Salida:
Estamos subiendo un archivo usando la opción del botón "Elegir archivo", y el botón "Subir archivo" subirá el archivo al servidor en la ruta que se proporcione.
Ejemplo: Uso de operaciones JSP
En este ejemplo, vamos a subir un archivo usando operaciones JSP. Usaremos un formulario que tendrá un botón de "subir" y, al hacer clic en él, se subirá el archivo.
Subiendo_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Guru Uploading File</title> </head> <body> File: <br /> <form action="guru_upload" method="post" enctype="multipart/form-data"> <input type="file" name="guru_file" size="50" /> <br /> <input type="submit" value="Upload" /> </form> </body> </html>
Explicación del código:
Code Línea 11-12: Aquí utilizamos un formulario que tiene una acción en el servlet guru_upload, la cual se envía mediante el método POST. El atributo enctype especifica cómo se deben codificar los datos del formulario y enviarlos al servidor, y solo se usa con el método POST. En este caso, lo configuramos como multipart/form-data, que corresponde al formato de archivo (ya que los datos serán extensos).
Code Línea 13: Aquí estamos especificando el elemento guru_file con el tipo archivo y dándole un tamaño de 50.
Code Línea 15: Se trata de un botón de envío con el nombre "Subir", mediante el cual se llamará al servlet de acción y se procesará la solicitud en él, y el archivo se leerá y escribirá en el servlet.
Guru_upload.java
package demotest; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class guru_upload extends HttpServlet { private static final long serialVersionUID = 1L; public guru_upload() { super(); // TODO Auto-generated constructor stub } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(ServletFileUpload.isMultipartContent(request)){ try { List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); for(FileItem item : multiparts){ if(!item.isFormField()){ String name = new File(item.getName()).getName(); item.write( new File("c:/guru/upload" + File.separator + name)); } } //File uploaded successfully request.setAttribute("gurumessage", "File Uploaded Successfully"); } catch (Exception ex) { request.setAttribute("gurumessage", "File Upload Failed due to " + ex); } }else{ request.setAttribute("gurumessage","No File found"); } request.getRequestDispatcher("/result.jsp").forward(request, response); } }
Explicación del código:
Code Línea 12-14: Aquí tendremos que importar la biblioteca org.apache.commons a la configuración del código. Tendremos que importar la clase fileupload de la biblioteca org.apache.commons.
Code Línea 23: Aquí tenemos el método doPost(), que se llamará ya que estamos pasando el método POST en JSP, y tomará los objetos de solicitud y respuesta como sus parámetros.
Code Línea 26: Aquí creamos un objeto de la clase ServletFileUpload del paquete fileUpload de la biblioteca org.apache.commons, que comprobará si existen objetos de archivo en la página JSP. Si se encuentran, se tomarán de la solicitud.
Code Línea 27-32: Iteraremos sobre la cantidad de archivos verificando cuántos elementos de archivo hay presentes en el objeto multiparts, que es un objeto de lista (si subimos más de un archivo), y lo guardaremos en la carpeta c:/guru/upload con el nombre de archivo proporcionado. Escribiremos el archivo usando el método write del objeto de archivo en la carpeta mencionada.
Code Línea 34: Si no hay ninguna excepción, entonces estamos estableciendo un atributo en la solicitud como gurumessage con el valor "Archivo cargado correctamente".
Code Línea 35-36: Si se produce una excepción, mostramos un mensaje que dice "Error al cargar el archivo".
Code Línea 40: Si no se encuentra el archivo, mostramos el mensaje "No se encontró ningún archivo".
Code Línea 42: Reenviar la solicitud utilizando el objeto requestdispatcher a result.jsp con los objetos request y response.
Resultado.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Guru Result</title> </head> <body> <% String msg = (String)request.getAttribute("message"); out.println(msg); %> </body> </html>
Explicación del código:
Code Línea 10: Aquí estamos obteniendo el atributo del objeto de solicitud con el valor gurumessage en un objeto de cadena.
Code Línea 11: Aquí estamos imprimiendo ese mensaje.
Cuando ejecutamos el código anterior, obtenemos el siguiente resultado:
Salida:
Aparece un formulario con campos para seleccionar un archivo del directorio. Una vez seleccionado el archivo, debemos hacer clic en el botón de carga.
Una vez que se hace clic en el botón de carga, recibimos el mensaje de que el archivo se ha cargado correctamente.
En el siguiente diagrama, podemos ver que el archivo se ha subido a la carpeta c:/guru/upload.
Descargar archivo JSP
En este ejemplo, vamos a descargar un archivo de un directorio haciendo clic en el botón.
Descargando_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Downloading Guru Example</title> </head> <body> Guru Downloading File<a href="guru_download">Download here!!!</a> </body> </html>
Explicación del código:
Code Línea 10: Aquí hemos proporcionado un enlace para descargar un archivo de la carpeta c:/guru/upload utilizando el servlet guru_download.
Guru_download.java
package demotest; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class guru_download */ public class guru_download extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String gurufile = "test.txt"; String gurupath = "c:/guru/upload/"; response.setContentType("APPLICATION/OCTET-STREAM"); response.setHeader("Content-Disposition", "attachment; filename=\"" + gurufile + "\""); FileInputStream fileInputStream = new FileInputStream(gurupath + gurufile); int i; while ((i = fileInputStream.read()) != -1) { out.write(i); } fileInputStream.close(); out.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
Explicación del código:
Code Línea 3-5: Aquí estamos importando FileInputStream, IOException y PrintWriter del paquete java.io.
Code Línea 15: Estamos definiendo guru_download servlet que extiende HttpServlet.
Code Línea 18: Como hemos definido un href, que estará encerrado en un URL, por lo que se procesará el método GET (se llamará a doGet en el servlet), que también incluye los objetos de solicitud y respuesta.
Code Línea 19-20: Estamos definiendo el tipo de contenido en el objeto de respuesta y también obteniendo el objeto escritor de la respuesta.
Code Línea 21-22: Definir una variable como gurufile con valor test.txt y gurupath como c:/guru/upload/.
Code Línea 23-25: Estamos definiendo el tipo de contenido mediante el objeto de respuesta, y usamos el método setHeader, que establece el encabezado en el objeto de respuesta como el nombre del archivo que se ha subido.
Code Línea 27-28: Estamos creando un FileInputStream en el que agregaremos gurupath+gurufile.
Code Línea 31-33: Aquí hemos tomado una mientras bucle que se ejecutará hasta que se lea el archivo, por lo tanto hemos dado la condición como != -1. En esta condición, estamos escribiendo usando el objeto printwriter out.
Al ejecutar el código anterior, obtendrá el siguiente resultado:
Salida:
Debemos hacer clic en downloading_1.jsp y obtendremos un enlace que dice "Descargar aquí". Al hacer clic en este enlace, el archivo se descargará en el sistema.






