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: