实现文件上传和下载功能是Web开发中比较常见的需求,其中使用Servlet技术是一种比较常用的方式。下面我将从Servlet的角度详细讲解如何实现文件上传和下载功能。
文件上传
1. 创建 HTML 表单
我们需要在 HTML 表单中添加 <input>
标签,然后设置 type
属性为 file
,即可实现文件上传功能。
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
注意:enctype
属性需要设置为 multipart/form-data
,这样才能支持文件上传。submit
按钮的 type
属性默认为 submit
,不需要设置。
2. 编写 Servlet 代码
当用户选择了要上传的文件之后,提交表单,服务器将调用 Servlet 的 doPost()
方法,同时,表单数据和文件将通过 HttpServletRequest
对象进行传递。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取上传文件的保存路径
String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 判断上传文件的保存目录是否存在,不存在就创建
File file = new File(savePath);
if(!file.exists() && !file.isDirectory()) {
file.mkdir();
}
// 获取上传的文件
Part part = req.getPart("file");
// 获取上传文件的文件名
String fileName = part.getSubmittedFileName();
// 将上传的文件保存到指定目录
part.write(savePath + File.separator + fileName);
resp.getWriter().println("文件上传成功!");
}
以上代码的主要步骤为:
- 获取上传文件的保存路径,即
WEB-INF/upload
目录。 - 判断上传文件的保存目录是否存在,如果不存在则创建。
- 从
HttpServletRequest
对象中获取上传的文件数据。 - 获取上传文件的文件名。
- 将上传的文件保存到指定目录。
- 返回上传成功信息。
示例
下面是一个完整的文件上传的示例代码。
首先,在 web.xml
文件中添加 Servlet 的配置:
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.example.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
然后,在 UploadServlet.java
文件中编写 Servlet 代码:
package com.example;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(name = "UploadServlet", value = "/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取上传文件的保存路径
String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 判断上传文件的保存目录是否存在,不存在就创建
File file = new File(savePath);
if(!file.exists() && !file.isDirectory()) {
file.mkdir();
}
// 获取上传的文件
Part part = req.getPart("file");
// 获取上传文件的文件名
String fileName = part.getSubmittedFileName();
// 将上传的文件保存到指定目录
part.write(savePath + File.separator + fileName);
resp.getWriter().println("文件上传成功!");
}
}
最后,创建一个 HTML 页面,让用户上传文件即可。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
</body>
</html>
文件下载
1. 编写 Servlet 代码
当用户请求下载文件时,服务器将调用 Servlet 的 doGet()
方法,同时,我们需要设置 HTTP 响应头信息,告知浏览器这是一个可以下载的文件,并设置文件的 MIME 类型。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取要下载的文件名
String fileName = req.getParameter("fileName");
// 设置文件的MIME类型
resp.setContentType(this.getServletContext().getMimeType(fileName));
// 设置Content-Disposition头信息,设置文件名和 attachment(表示浏览器会把文件当做附件下载)
resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 读取要下载的文件,然后发送给客户端
FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("/WEB-INF/upload/" + fileName));
OutputStream out = resp.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
}
以上代码的主要步骤为:
- 获取要下载的文件名,这个文件名是从前端传递过来的。
- 设置文件的 MIME 类型。
- 设置 HTTP 响应头信息,告知浏览器这是一个可以下载的文件,并设置文件的名称和 attachment(表示浏览器会把文件当做附件下载)。
- 读取要下载的文件,并写入输出流中。最后,关闭输入流。
示例
下面是一个完整的文件下载的示例代码。
首先,在 web.xml
文件中添加 Servlet 的配置:
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
然后,在 DownloadServlet.java
文件中编写 Servlet 代码:
package com.example;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(name = "DownloadServlet", value = "/download")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取要下载的文件名
String fileName = req.getParameter("fileName");
// 设置文件的MIME类型
resp.setContentType(this.getServletContext().getMimeType(fileName));
// 设置Content-Disposition头信息,设置文件名和 attachment(表示浏览器会把文件当做附件下载)
resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 读取要下载的文件,然后发送给客户端
FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("/WEB-INF/upload/" + fileName));
OutputStream out = resp.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
}
}
最后,在 HTML 页面中添加下载链接,即可实现文件下载功能。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<a href="download?fileName=test.pdf">下载测试文件</a>
</body>
</html>
其中,download
在 Servlet 中的 url-pattern
值为 /download
,fileName
是我们要下载的文件名,这个文件名可以从数据库、XML、文本文件等任何地方获取到。在示例中,我直接写死了一个测试文件名 test.pdf
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:servlet实现文件上传与下载功能 - Python技术站