实现 Servlet 文件下载功能,需要经历以下几个步骤:
- 在 Web 项目的 WEB-INF 目录下创建 servlet-context.xml 配置文件,添加一条 Bean 标签用于初始化 Servlet 。
<bean id="fileDownloadServlet" class="com.example.controller.FileDownloadServlet" init-method="init"/>
- 创建一个 Servlet ,用于处理下载请求,并在 init 方法中初始化 Servlet 的相关配置。在 Servlet 中,需要获取要下载的文件路径及文件名称,以及设置 HttpServletResponse 对象相关的响应头信息。
public class FileDownloadServlet extends HttpServlet {
private String filePath;
private String fileName;
@Override
public void init() throws ServletException {
ServletContext servletContext = getServletContext();
filePath = servletContext.getRealPath("/WEB-INF/download/");
fileName = "test.txt";
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
File file = new File(filePath + fileName);
if (file.exists()) {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
ServletOutputStream outputStream = response.getOutputStream();
InputStream in = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
in.close();
} else {
response.getWriter().println("<h1>File not found.</h1>");
}
}
}
- 在 JSP 页面上添加一个超链接,用于向 Servlet 发送下载请求。例如:
<a href="downloadServlet">下载文件</a>
- 将下载文件放置在 Web 项目的 WEB-INF 目录下的 download 子目录中,例如:/WEB-INF/download/test.txt。
示例一:
我们在一个叫做 myspring 的 Java Web 项目中创建 ServletContext.xml 的配置文件,输入以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="fileDownloadServlet" class="com.example.controller.FileDownloadServlet" init-method="init"/>
</beans>
在 com/example/controller/ 路径下,创建一个 Java 类 FileDownloadServlet。
public class FileDownloadServlet extends HttpServlet {
private String filePath;
private String fileName;
@Override
public void init() throws ServletException {
ServletContext servletContext = getServletContext();
filePath = servletContext.getRealPath("/WEB-INF/download/");
fileName = "test.txt";
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
File file = new File(filePath + fileName);
if (file.exists()) {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
ServletOutputStream outputStream = response.getOutputStream();
InputStream in = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
in.close();
} else {
response.getWriter().println("<h1>File not found.</h1>");
}
}
}
在 web.xml 中,添加以下内容,将 /download 路径映射到 FileDownloadServlet 中。
<servlet>
<servlet-name>downloadServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:META-INF/spring/servlet-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>downloadServlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
示例二:
我们在一个 Java Web 项目的 WebContent 文件夹下,新建一个路径为 WEB-INF/download/ 的文件夹,将要下载的文件放在该文件夹中,例如:文件名为 test.txt。
在 WebContent 文件夹下,新建文件 download.jsp 文件,输入以下内容:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<h4><a href="./downloadServlet?fileName=test.txt">下载文件 test.txt</a></h4>
</body>
</html>
在 WebContent 下的 WEB-INF 文件夹下,创建 web.xml 文件,添加以下内容:
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>com.example.controller.FileDownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/downloadServlet</url-pattern>
</servlet-mapping>
在 com/example/controller/ 路径下,创建一个 Java 类 FileDownloadServlet。
public class FileDownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应内容类型
response.setContentType("application/octet-stream");
String fileName = request.getParameter("fileName");
String filePath = request.getSession().getServletContext().getRealPath("/") + "download/" + fileName;
//设置响应头信息
response.setHeader("Content-Disposition", "attachment;fileName=\"" + fileName + "\"");
//读取要下载的文件,保存到文件输入流
FileInputStream inputStream = new FileInputStream(filePath);
//创建输出流
OutputStream outputStream = response.getOutputStream();
//创建缓冲区
byte[] buffer = new byte[1024];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while ((len = inputStream.read(buffer)) > 0) {
//输出缓冲区的内容到浏览器,实现文件下载
outputStream.write(buffer, 0, len);
}
//关闭文件输入流和输出流
inputStream.close();
outputStream.close();
}
}
最后,在 Tomcat 中启动该 Web 项目,运行在本地端口,访问 download.jsp 页面即可下载 test.txt 文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单实现Servlet文件下载功能 - Python技术站