【JavaWeb】文件上传

准备工作

apache的开源工具common-fileupload包负责完成文件上传,其依赖于common-io包

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

使用类介绍

文件上传的注意事项:

  • 为保证服务器安全,上传文件应该放在外界无法访问的目录下,比如WEB-INF目录下(该目录下的文件只能通过转发和重定向跳转
  • 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名(使用uuid或时间戳)
  • 要限制上传文件的最大值
  • 可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法

使用类:

  • DiskFileItemFactory:解析ServletFileUpload对象
  • ServletFileUpload:负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象
  • FileItem:表单的每个输入项都是一个FileItem对象

用法示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<body>
<h2>Hello World!</h2>

<%-- 通过表单上传文件
get:上传文件大小有限制
post:上传文件大小没限制
--%>
<form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">
上传用户:<input type="text" name="username"><br/>
<p><input type="file" name="file1"></p>
<p><input type="file" name="file2"></p>
<p><input type="submit"> | <input type="reset"></p>
</form>

</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (ServletFileUpload.isMultipartContent(req)) {
FileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
List<FileItem> list = servletFileUpload.parseRequest(req);

for (FileItem fileItem : list) {
if (fileItem.isFormField()) {
// 普通表单项
System.out.println(fileItem.getFieldName());
System.out.println(fileItem.getString("UTF-8"));
} else {
fileItem.write(new File("D:\\fileItem.getFieldName()");
}
}
} catch (Exception e) {
System.out.println(e);
}
}