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.

  • 📤 Información básica sobre la carga de archivos: Utilice el método POST y configure enctype como multipart/form-data para cualquier carga de archivos.
  • 🧩 Apache Commons: DiskFileItemFactory y ServletFileUpload analizan la solicitud multipart y la dividen en elementos de archivo.
  • 🗂️ Manejo de servlets: El método doPost itera sobre los elementos del archivo y escribe cada uno en una carpeta de destino.
  • 📥 Descargar Flow: Un servlet transmite un archivo utilizando FileInputStream y el encabezado Content-Disposition.
  • ⚙️ Configuración: Las rutas de archivo, los límites de tamaño y el tipo de contenido deben configurarse antes de leer o escribir.

Carga y descarga de archivos JSP

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:

Carga de archivos JSP

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.

Carga de archivos mediante operaciones JSP

Una vez que se hace clic en el botón de carga, recibimos el mensaje de que el archivo se ha cargado correctamente.

Carga de archivos mediante operaciones JSP

En el siguiente diagrama, podemos ver que el archivo se ha subido a la carpeta c:/guru/upload.

Carga de archivos mediante operaciones JSP

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:

Descargando archivo

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.

Preguntas Frecuentes

Sí. Los asistentes de IA pueden generar servlets y formularios JSP para la carga y descarga de archivos, añadir lógica de Apache Commons FileUpload y sugerir validaciones. Aun así, conviene probar el código y revisar las rutas de archivo y los límites de tamaño.

Sí. Los escáneres basados ​​en IA pueden inspeccionar los archivos subidos en busca de malware, tipos inesperados o cargas útiles excesivas antes de que lleguen al almacenamiento. Esto añade una capa de protección, aunque la validación del tipo y tamaño en el servidor sigue siendo fundamental.

La codificación multipart/form-data divide la solicitud en partes para que los datos del archivo binario sean transmitted intacto. Sin él, el navegador solo envía el nombre del archivo, no el contenido real del archivo, al servidor.

Apache Commons FileUpload, junto con Commons IO, es ampliamente utilizado. Analiza las solicitudes multipart, expone cada FileItem y escribe el contenido subido en un directorio elegido en el servidor.

Resumir este post con: