- 程序介绍
Servlet 是 Java Web 应用程序的基础组件。它是作为服务器端程序运行的 Java 类,用来处理传入的 web 请求并生成响应的 web 页面。
Servlet 允许开发人员开发动态的 Web 应用,因此很多 Web 应用都是使用 Servlet 编写的。为了更好地满足用例需求,本文将介绍如何使用 Servlet 去实现多文件上传功能。
- 准备工作
要准备好环境以便于使用 Servlet,需要以下三个软件:
- Java SE Development Kit (JDK):Java SE Development Kit ,是 Oracle 官方发布的 Java SE 应用程序开发工具包,用于编码、编译和运行 Java 应用程序。
- Apache Tomcat:Apache Tomcat 是一款基于 Java 技术的 Web 服务器,支持 Servlet 和 JSP。
-
Eclipse IDE:Eclipse 是 Java 开发的集成开发环境。使用 Eclipse 开发 Servlet 应用程序可以方便地构建和调试 Servlet 应用程序。
-
实现多文件上传方法
在 Servlet 中实现多文件上传的方法如下:
首先你需要创建一个 HTML 页面,用于上传文件。代码示例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="fileUploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="file1">
<br>
<input type="file" name="file2">
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
其中,action 属性指定了提交的 URL 地址;method 属性指定了提交的方法;enctype 属性指定了表单数据的编码类型,multipart/form-data 表示支持二进制上传。
在 Servlet 的 doGet 方法中,你可以处理 GET 请求。在这里,你需要在 doGet 方法中调用 doPost 方法来处理 POST 请求,如下所示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
在 doPost 方法中,你可以处理文件上传请求。在 Servlet 中上传文件使用的是 commons-fileupload 库。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建 DiskFileItemFactory 的实例,以便在设置上传参数时使用
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存阈值,超过后将产生临时文件并存储于临时目录中
factory.setSizeThreshold(1024 * 1024 * 10);
// 设置临时存储目录
File uploadFolder = new File(getServletContext().getRealPath("/tmp"));
if (!uploadFolder.exists()) {
uploadFolder.mkdirs();
}
factory.setRepository(uploadFolder);
// 创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件的总大小限制
upload.setFileSizeMax(1024 * 1024 * 20);
// 每个上传文件限制大小
upload.setSizeMax(1024 * 1024 * 20);
// 处理上传文件
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = item.getName();
String filePath = "d:\\" + File.separator + fileName;
File uploadedFile = new File(filePath);
item.write(uploadedFile);
}
}
}
- 示例1
在这个示例中,我们在 HTML 页面中上传一个文件,该文件将被保存在 D 盘根目录。
HTML 代码如下:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传示例</title>
</head>
<body>
<form action="file-upload" method="post" enctype="multipart/form-data">
<input type="file" name="filename">
<br>
<input type="submit" value="上传">
</form>
</body>
</html>
Servlet 代码如下:
@WebServlet("/file-upload")
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String UPLOAD_DIRECTORY = "d:" + File.separator;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 上传文件目录
File uploadDir = new File(UPLOAD_DIRECTORY);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
try {
List<FileItem> formItems = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
if (formItems != null && formItems.size() > 0) {
for (FileItem item : formItems) {
// 如果是普通表单域,保存到 request 中
if (item.isFormField()) {
request.setAttribute(item.getFieldName(), item.getString("UTF-8"));
} else {
String fileName = new File(item.getName()).getName();
String filePath = UPLOAD_DIRECTORY + File.separator + fileName;
File storeFile = new File(filePath);
item.write(storeFile);
request.setAttribute("message", "文件上传成功!");
}
}
}
} catch (Exception ex) {
request.setAttribute("message", "文件上传失败: " + ex.getMessage());
}
// 跳转到 message.jsp 页面
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
- 示例2
在这个示例中,我们在 HTML 页面中上传多个文件,并将它们以 JSONArray 形式呈现出来。
HTML 代码如下:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>多文件上传示例</title>
</head>
<body>
<form action="multi-file-upload" method="post" enctype="multipart/form-data">
<input type="file" name="filename" multiple>
<br>
<input type="submit" value="上传">
</form>
</body>
</html>
Servlet 代码如下:
@WebServlet("/multi-file-upload")
public class MultiFileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
JSONArray array = new JSONArray(); // 保存文件信息的 JSONArray
String uploadDir = "d:\\files\\";
// 创建 factory 和 servletFileUpload 实例
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
try {
// 处理上传请求
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
if (fileItems != null && fileItems.size() > 0) {
for (FileItem fileItem : fileItems) {
if (!fileItem.isFormField()) { // 如果项是文件
String fileName = fileItem.getName();
String filePath = uploadDir + fileName;
File storeFile = new File(filePath);
fileItem.write(storeFile); // 保存文件到指定目录
// 保存文件信息到 JSONArray 中
JSONObject obj = new JSONObject();
obj.put("name", fileName);
obj.put("size", fileItem.getSize());
obj.put("type", fileItem.getContentType());
array.add(obj);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
// 将文件信息 JSONArray 作为属性绑定到 request 对象上
request.setAttribute("files", array);
// 跳转到 message.jsp 页面
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
6.总结
在本文中,我们介绍了使用 Servlet 实现多文件上传功能的完整攻略。为了实现文件上传,我们使用了 commons-fileupload 库,同时给出了两个示例供读者参考。
希望这篇文章对学习 Servlet 进行 Web 开发的读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Servlet实现多文件上传功能 - Python技术站