servlet 实现多文件上传
时间: 2024-06-18 16:05:21 浏览: 74
Servlet 是 Java Web 开发中常用的技术之一,它可以处理 HTTP 请求和响应。关于多文件上传的实现,一般有两种方式:
1. 使用 Apache Commons FileUpload 库
该库是 Apache 组织开发的一个用于处理文件上传的 Java 库,可以方便地实现多文件上传功能。具体使用方法可以参考以下代码示例:
```
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取上传文件的保存目录
String savePath = getServletContext().getRealPath("/upload");
// 判断上传文件的保存目录是否存在,不存在则创建
File file = new File(savePath);
if (!file.exists() && !file.isDirectory()) {
System.out.println(savePath + "目录不存在,需要创建");
file.mkdir();
}
// 消息提示
String message = "";
try {
// 创建 DiskFileItemFactory 对象,设置缓冲区大小和临时文件目录
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1024 * 10); // 设置缓冲区大小为10M
factory.setRepository(file); // 设置临时文件目录为 upload 目录
// 创建 ServletFileUpload 对象,并设置上传文件的大小限制
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(1024 * 1024 * 100); // 设置上传文件大小的最大值为100M
// 解析上传的文件
List<FileItem> items = upload.parseRequest(request);
// 遍历解析的文件
for (FileItem item : items) {
// 判断是否为上传文件项
if (item.isFormField()) {
String fieldName = item.getFieldName();
String fieldValue = item.getString("UTF-8");
System.out.println(fieldName + "=" + fieldValue);
} else {
// 获取上传文件名
String fileName = item.getName();
System.out.println("上传的文件名为:" + fileName);
// 如果文件名为空,则说明没有选择上传文件
if (fileName == null || fileName.trim().equals("")) {
continue;
}
// 获取上传文件的后缀名
String suffix = fileName.substring(fileName.lastIndexOf("."));
// 新建一个文件名,避免重复
String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
// 创建上传文件对象
File uploadFile = new File(savePath, newFileName);
// 将上传文件保存到指定目录下
item.write(uploadFile);
message = "文件上传成功!";
}
}
} catch (Exception e) {
message = "文件上传失败!";
e.printStackTrace();
}
request.setAttribute("message", message);
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
```
2. 使用 HTML5 的 FormData 对象
在 HTML5 中,新增了 FormData 对象,它可以用于在客户端向服务器发送数据。结合 AJAX 技术,可以实现多文件上传功能。以下是使用 FormData 和 AJAX 实现多文件上传的示例代码:
```
<form id="uploadForm">
<input type="file" name="file" multiple>
<input type="button" value="上传" onclick="upload()">
</form>
<script>
function upload() {
var form = document.getElementById("uploadForm");
var formData = new FormData(form);
var xhr = new XMLHttpRequest();
xhr.open("POST", "/uploadServlet");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseText);
}
};
xhr.send(formData);
}
</script>
```
需要注意的是,在使用 FormData 对象上传多个文件时,要将表单元素的 multiple 属性设置为 true。
阅读全文