Carga y descarga de archivos JSP

En este ejemplo, aprenderemos cómo cargar y descargar un archivo a través de JSP.

Las operaciones de entrada y salida de archivos son muy importantes. Aquí vamos a leer y escribir un archivo usando 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 cargando 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

Línea de código 12-18: Aquí estamos creando un formulario con el campo de archivo, que cargará el archivo en el servidor y la acción se pasará a action_file_upload.jsp.

Action_file_upload.jsp

Línea de código 20: Aquí le damos la ruta del archivo a una ruta particular.

Línea de código 23-38: Aquí comprobamos si el tipo de contenido es multiparte/formulario. Si ese es el caso, entonces el contenido es de tipo archivo y se lee. Después de leer el archivo, se escribe en el archivo temporal y luego el archivo temporal se convierte en el archivo principal.

Cuando ejecutas el código anterior, obtienes el siguiente resultado

Carga de archivos JSP

Salida:

Estamos cargando un archivo usando la opción del botón Seleccionar archivo y el botón Cargar archivo cargará el archivo al servidor en la ruta proporcionada.

Ejemplo: Uso de operaciones JSP

En este ejemplo, vamos a cargar un archivo mediante operaciones JSP. Utilizaremos un formulario que tendrá un botón de "cargar" y, cuando haga clic en el botón de carga, se cargará 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:

Línea de código 11-12: Aquí tomamos un formulario que tiene una acción en el servlet guru_upload que pasará a través de un método POST. Además, aquí enctype ie atributo que especifica cómo los datos del formulario deben codificarse y enviarse al servidor y solo se utiliza con el método POST. Aquí estamos configurando como multipart/form-data que es para el archivo (ya que los datos serán grandes).

Línea de código 13: Aquí especificamos el elemento guru_file con el tipo de archivo y le damos un tamaño de 50.

Línea de código 15: Este es un botón de tipo de envío con el nombre "Cargar" a través del cual se llamará al servlet de acción y la solicitud se procesará 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:

Línea de código 12-14: Aquí tendremos que importar la biblioteca org.apache.commons a la configuración del código. Tendremos que importar la clase de carga de archivos de la biblioteca org.apache.commons.

Línea de código 23: Aquí tenemos el método doPost(), que se llamará cuando pasemos el método POST en JSP y solicitará y responderá objetos como sus parámetros.

Línea de código 26: Aquí estamos creando un objeto de la clase ServletFileUpload del paquete fileUpload de la biblioteca org.apache.commons que comprobará si hay objetos de archivo en JSP. Si se encuentra alguno, ese objeto de archivo se tomará de la solicitud.

Línea de código 27-32: Iteraremos la cantidad de archivos verificando cuántos elementos de archivo están presentes en el objeto multipartes, que es un objeto de lista (si cargamos más de un archivo) y lo guardaremos en la carpeta c:/guru/upload con el nombre de archivo que se ha proporcionado. . Estamos escribiendo el archivo utilizando el método de escritura del objeto de archivo en la carpeta que se ha mencionado.

Línea de código 34: Si no hay excepción, entonces configuramos el atributo en la solicitud como gurumessage con el valor "Archivo cargado correctamente".

Línea de código 35-36: Si se produce una excepción, se configura el mensaje "Falló la carga del archivo".

Línea de código 40: Si no se encuentra el archivo, configure el mensaje como "No se encontró ningún archivo".

Línea de código 42: Reenviar solicitud utilizando el objeto requestdispatcher a result.jsp con objetos de solicitud y respuesta.

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:

Línea de código 10: Aquí obtenemos el atributo del objeto de solicitud con valor gurumessage en un objeto de cadena.

Línea de código 11: Aquí estamos imprimiendo ese mensaje.

Cuando ejecutamos el código anterior obtenemos el siguiente resultado

Salida:

Obtenemos un formulario en el que hay campos para elegir un archivo del directorio. Una vez seleccionado el archivo entonces tenemos que hacer clic en el botón cargar.

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 cargó correctamente.

Carga de archivos mediante operaciones JSP

En el siguiente diagrama podemos ver que el archivo se cargó en 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:

Línea de código 10: Aquí le proporcionamos un enlace para descargar un archivo de la carpeta c:/guru/upload usando 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:

Línea de código 3-5: Aquí estamos importando FileInputStream, IO Exception y PrintWriter del paquete java.io.

Línea de código 15: Estamos definiendo guru_download servlet que extiende HttpServlet.

Línea de código 18: Como hemos definido un href, que se incluirá en la URL, se procesará el método GET (se llamará a doGet en el servlet), que también incluye objetos de solicitud y respuesta.

Línea de código 19-20: Estamos configurando el tipo de contenido en el objeto de respuesta y también obtenemos el objeto del escritor de la respuesta.

Línea de código 21-22: Definir una variable como gurufile como valor test.txt y gurupath como c:/guru/upload/

Línea de código 23-25: Estamos configurando el tipo de contenido usando 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 cargado.

Línea de código 27-28: Estamos creando FileInputStream en el que agregaremos gurupath+gurufile.

Línea de código 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 utilizando el objeto printwriter.

Cuando ejecute el código anterior, obtendrá el siguiente resultado

Salida:

Descargando archivo

Salida:

Tenemos que hacer clic en downloading_1.jsp y obtendremos un hipervínculo como "Descargar aquí". Cuando hace clic en este archivo de hipervínculo, se descargará en el sistema.

Resum

  • Hemos aprendido sobre el formulario de registro para registrarse en cualquier aplicación.
  • Aprendí más sobre cómo funcionan los formularios de inicio y cierre de sesión.
  • También aprendí sobre cómo cargar y descargar un archivo a través de JSP.