Servlet – 下载文件
Servlet 是在支持Java的 Web 服务器或应用程序服务器上运行的 Java 程序。它们用于处理从网络服务器获得的请求,处理请求,产生响应,然后将响应发送回网络服务器。在本文中,我们将学习下载 .docx、.pdf、.png 等文件。从服务器使用 Servlet。
分步实施
为用户交互创建一个 HTML 页面。创建Java Servlet 来处理客户端请求、处理并将响应发送到客户端浏览器。
索引.html
HTML
Welcome
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 标头描述了正文部分的内容。
格式:
Content-type: type/subtype; parameter=value; parameter=value…
- type – It describes the type of content of the body part like Text, Multipart, Message, Application, Image, Audio, and Video.
- subtype – It further describes the content type like text/plain, application/octet-stream, and image/jpeg.
- parameter – It is specific to Content-type/subtype pairs and values.
根据请求和响应,设置应用程序中使用的响应内容类型很重要。通常,使用 Servlet 下载文件时,会使用application/octet-stream内容类型。它针对未知的二进制文件进行了描述。通常,它是在电子表格/pdf/文字处理器等应用程序中打开的应用程序或文档。这会保留文件内容,但接收方必须根据文件扩展名确定文件类型。但是,如果我们知道文件的细节,我们可以使用以下不同的格式设置响应的内容类型。
对于文本、PDF、文档、Excel 等文件:
- 应用程序/八位字节流
- 申请/pdf
- 应用程序/msword
- 应用程序/压缩包
- 文本/csv
对于图像、视频等文件:
- 图片/JPEG
- 图片/png
- 图片/bmp
- 图片/gif
- 视频/mp4等
现在,我们需要设置提供响应详细上下文的响应标头。
内容配置:
Content-disposition 为响应正文部分提供表示信息。处理附件时,此标题可用于指定附件正文部分应显示(内联)还是显示为要复制的文件名(附件)。
格式:
Content-disposition: disposition_type; parameter=value;parameter=value…
- disposition_type – To specify whether inline (display the body part) or attachment (present as file to save.)
附件通常具有参数文件名,其值指定保存文件的建议名称。在此示例中,我们将 disposition_type 指定为附件,其参数值是文件名及其路径。
Java
response.setHeader("Content-Disposition","attachment; filename=\"" + pdfName + "\"");
一旦 servlet 访问文件,现在我们需要使用FileInputStream 读取文件的内容。因此,获取 FileInputStream 的对象并循环遍历文档以读取和写入PrintWriter对象。最后关闭连接——FileInputStream 和 PrintWriter 对象。
输出:
运行 index.html 文件。网址: http://localhost:8081/DownloadServlet/index.html
单击“下载”后,文档将在浏览器中下载,如下所示。
这样,我们可以通过在响应中指定相应的内容类型和标头来使用 Servlet 下载任何类型的文件,例如文本文件、图像文件或视频文件。