📜  Servlet – 下载文件

📅  最后修改于: 2022-05-13 01:54:19.919000             🧑  作者: Mango

Servlet – 下载文件

Servlet 是在支持Java的 Web 服务器或应用程序服务器上运行的 Java 程序。它们用于处理从网络服务器获得的请求,处理请求,产生响应,然后将响应发送回网络服务器。在本文中,我们将学习下载 .docx、.pdf、.png 等文件。从服务器使用 Servlet。

分步实施

为用户交互创建一个 HTML 页面。创建Java Servlet 来处理客户端请求、处理并将响应发送到客户端浏览器。

索引.html

HTML




Welcome


    
        

Welcome to GeeksforGeeks.

        

Download the updated Data structures course structure here.

             


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();
    }
}


Java
response.setContentType("application/msword");


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



index.html 中,我们正在与输入表单进行用户交互。一旦用户单击下载按钮,基于表单操作和方法属性,servlet 容器将映射相应 servlet 中的doget()方法。

下载。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();
    }
}


我们使用@WebServlet()注释将请求URL 映射到相应的servlet,而不是使用部署描述符——web.xml。由于我们在客户端请求中指定了获取方法容器将在下载中执行doget()方法。 Java小服务程序。我们需要提供必须通过浏览器下载的文件名及其位置。在此示例中,我们使用.docx文件。我们需要将响应的内容类型指定为“ application/msword ”,以便描述通过响应发送的内容类型。

Java

response.setContentType("application/msword");


内容类型:

Content-Type 标头描述了正文部分的内容。

格式:

根据请求和响应,设置应用程序中使用的响应内容类型很重要。通常,使用 Servlet 下载文件时,会使用application/octet-stream内容类型。它针对未知的二进制文件进行了描述。通常,它是在电子表格/pdf/文字处理器等应用程序中打开的应用程序或文档。这会保留文件内容,但接收方必须根据文件扩展名确定文件类型。但是,如果我们知道文件的细节,我们可以使用以下不同的格式设置响应的内容类型。

对于文本、PDF、文档、Excel 等文件:

  • 应用程序/八位字节流
  • 申请/pdf
  • 应用程序/msword
  • 应用程序/压缩包
  • 文本/csv

对于图像、视频等文件:

  • 图片/JPEG
  • 图片/png
  • 图片/bmp
  • 图片/gif
  • 视频/mp4等

现在,我们需要设置提供响应详细上下文的响应标头。

内容配置:

Content-disposition 为响应正文部分提供表示信息。处理附件时,此标题可用于指定附件正文部分应显示(内联)还是显示为要复制的文件名(附件)。

格式:

附件通常具有参数文件名,其值指定保存文件的建议名称。在此示例中,我们将 disposition_type 指定为附件,其参数值是文件名及其路径。

Java

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


一旦 servlet 访问文件,现在我们需要使用FileInputStream 读取文件的内容。因此,获取 FileInputStream 的对象并循环遍历文档以读取和写入PrintWriter对象。最后关闭连接——FileInputStream 和 PrintWriter 对象。

输出:

运行 index.html 文件。网址: http://localhost:8081/DownloadServlet/index.html

输出

index.html 页面

单击“下载”后,文档将在浏览器中下载,如下所示。

输出

下载文件

这样,我们可以通过在响应中指定相应的内容类型和标头来使用 Servlet 下载任何类型的文件,例如文本文件、图像文件或视频文件。