Servlet – Descargando archivo

Los servlets son los programas Java que se ejecutan en el servidor web o en el servidor de aplicaciones habilitado para Java. Se utilizan para manejar la solicitud obtenida del servidor web, procesar la solicitud, producir la respuesta y luego enviar una respuesta al servidor web. En este artículo, aprenderemos a descargar un archivo como .docx, .pdf, .png, etc. desde el servidor usando Servlets.

Implementación paso a paso

Cree una página HTML para la interacción del usuario. Cree Java Servlet para manejar la solicitud del cliente, procesar y enviar la respuesta al navegador del cliente.

índice.html

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Welcome</title>
</head>
<body>
    <form action="download" method="get">
        <h2>Welcome to GeeksforGeeks.</h2>
        <h3>Download the updated Data structures course structure here.</h3>
        <input type="submit" value="Download" />
    </form>
</body>
</html>

En index.html, estamos haciendo una interacción del usuario con el formulario de entrada. Una vez que el usuario hace clic en el botón de descarga , según la acción del formulario y los atributos del método, el contenedor del servlet asignará el método doget() al servlet respectivo.

Descargar.java

Java

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
 
@WebServlet("/download")
public class Download extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException
    {
 
        // Get PrintWriter object
        PrintWriter out = response.getWriter();
        // File name
        String pdfName = "DataStructures.docx";
        // File path
        String pdfPath = "e:\\";
 
        // Set the content type and header of the response.
        response.setContentType("application/msword");
        response.setHeader("Content-Disposition",
                           "attachment; filename=\""
                               + pdfName + "\"");
 
        // Get FileInputStream object to identify the path
        FileInputStream inputStream
            = new FileInputStream(pdfPath + pdfName);
 
        // Loop through the document and write into the
        // output.
        int in;
        while ((in = inputStream.read()) != -1) {
            out.write(in);
        }
 
        // Close FileInputStream and PrintWriter object
        inputStream.close();
        out.close();
    }
}

Estamos usando la anotación @WebServlet() para asignar la URL de solicitud al servlet respectivo en lugar de usar el descriptor de implementación: web.xml. Como especificamos el método para ingresar a la solicitud del cliente , el contenedor ejecutará el método doget() en el servlet Download.java . Necesitamos proporcionar el nombre del archivo que debe descargarse a través del navegador y su ubicación. En este ejemplo, estamos usando el archivo .docx . Necesitamos especificar el tipo de contenido de la respuesta como » aplicación/msword «, para que describa qué tipo de contenido se envía a través de la respuesta.

Java

response.setContentType("application/msword");

Tipo de contenido:

El encabezado Content-Type describe el contenido de la parte del cuerpo. 

Formato:

Tipo de contenido: tipo/subtipo; parámetro=valor; parámetro=valor…

  • tipo: describe el tipo de contenido de la parte del cuerpo, como Texto, Varias partes, Mensaje, Aplicación, Imagen, Audio y Video.
  • subtipo: describe además el tipo de contenido como texto/sin formato, aplicación/flujo de octetos e imagen/jpeg.
  • parámetro: es específico de los pares y valores de tipo de contenido/subtipo.

En función de la solicitud y la respuesta, es importante establecer el tipo de contenido de respuesta que se utiliza en la aplicación. En general, al descargar los archivos mediante Servlet, se utiliza el tipo de contenido application/octet-stream . Se describe para archivos binarios desconocidos. Por lo general, es una aplicación o un documento abierto en una aplicación como una hoja de cálculo/pdf/procesador de textos. Esto conserva el contenido del archivo, pero el receptor tiene que determinar el tipo de archivo a partir de la extensión del nombre del archivo. Pero, si conocemos los detalles del archivo, podemos establecer el tipo de contenido de la respuesta con los siguientes formatos diferentes. 

Para archivos como Texto, PDF, Documento, Excel:

  • aplicación/flujo de octetos
  • Solicitud PDF
  • aplicación/msword
  • aplicación/código postal
  • texto/csv

Para los archivos como Imágenes, Videos:

  • imagen/jpeg
  • imagen/png
  • imagen/bmp
  • imagen/gif
  • vídeo/mp4, etc

Ahora, debemos configurar el encabezado de respuesta que proporciona el contexto detallado de la respuesta.

Disposición del contenido: 

Content-disposition proporciona la información de presentación para la parte del cuerpo de respuesta. Al trabajar con archivos adjuntos, este encabezado se puede usar para especificar si la parte del cuerpo del archivo adjunto debe mostrarse (en línea) o presentarse como un nombre de archivo para copiar (archivo adjunto).

Formato:

Disposición de contenido: disposición_tipo; parámetro=valor;parámetro=valor…

  • disposition_type: para especificar si está en línea (muestra la parte del cuerpo) o adjunto (presenta como archivo para guardar).

El archivo adjunto suele tener el parámetro nombre de archivo con un valor que especifica el nombre sugerido para el archivo guardado. En este ejemplo, especificamos tipo_disposición como archivo adjunto y su valor de parámetro, que es el nombre del archivo y su ruta.

Java

response.setHeader("Content-Disposition","attachment; filename=\"" + pdfName + "\"");

Una vez que el servlet accede al archivo, ahora necesitamos leer el contenido del archivo usando FileInputStream. Por lo tanto, obtenga el objeto de FileInputStream y recorra el documento para leer y escribir en el objeto PrintWriter . Finalmente cierre las conexiones: objetos FileInputStream y PrintWriter.

Producción:

Ejecute el archivo index.html. URL: http://localhost:8081/DownloadServlet/index.html

Output

página index.html

Una vez que hagamos clic en Descargar , el documento se descargará en el navegador como se muestra a continuación.

Output

Descargando el documento

De esta manera, podemos descargar cualquier tipo de archivo como archivo de texto, archivo de imagen o archivo de video utilizando Servlets especificando el tipo de contenido y los encabezados respectivos en la respuesta.

Publicación traducida automáticamente

Artículo escrito por yaminitalisetty y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *