Java:文件上传

定义文件路径和缓冲路径:

1
2
public static final String FILE_PATH = "D:/TEST";
public static final String FILE_IO_PATH = "D:/TEST_IO";

定义允许上传的文件扩展名:

1
private String Ext_Name = "doc,txt,sh,json,zip,exe,jar";

目录检查:

1
2
3
4
5
File saveFileDir = new File(savePath);
if (!saveFileDir.exists()) {
// 创建临时目录
saveFileDir.mkdirs();
}

上传时生成临时文件保存目录 :

1
2
3
4
5
6
String tmpPath = FILE_IO_PATH;
File tmpFile = new File(tmpPath);
if (!tmpFile.exists()) {
// 创建临时目录
tmpFile.mkdirs();
}

设置消息提示:

1
String message = "";

文件上传:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
try {
// 创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置工厂的缓冲区的大小
factory.setSizeThreshold(1024 * 10);// 设置缓冲区的大小为100KB
// 设置上传时生成的临时文件的保存目录
factory.setRepository(tmpFile);
// 创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 监听文件上传进度
upload.setProgressListener(new ProgressListener() {
public void update(long readedBytes, long totalBytes,
int currentItem) {
// TODO Auto-generated method stub
System.out.println("当前已处理:" + readedBytes
+ "-----------文件大小为:" + totalBytes + "--"
+ currentItem);
}
});
// 解决上传文件名的中文乱码问题
upload.setHeaderEncoding("UTF-8");
// 判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
return;
}
// 设置上传单个文件的最大值
upload.setFileSizeMax(1024 * 1024 * 100);// 100M
// 设置本次上传的所有文件的总和的最大值
upload.setSizeMax(1024 * 1024 * 500);// 500M
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
// 普通的输入
if (item.isFormField()) {
//String name = item.getFieldName();
//// 解决数据中文乱码问题
//String value = item.getString("UTF-8");
//System.out.println(name + "=" + value);
continue;
} else
// 上传文件
{
// 得到上传文件的文件名
String fileName = item.getName();
System.out.println("文件名:" + fileName);
if (fileName == null && fileName.trim().length() == 0) {
continue;
}
// 保留文件名部分
fileName = fileName
.substring(fileName.lastIndexOf("\\") + 1);
System.out.println("文件名部分:" + fileName);
// 得到上传文件的扩展名
String fileExt = fileName.substring(
fileName.lastIndexOf(".") + 1).toLowerCase();
System.out.println("上传的文件的扩展名是:" + fileExt);
// 检查扩展名
if (!Ext_Name.contains(fileExt)) {
System.out.println("上传文件扩展名是不允许的扩展名:" + fileExt);
message = message + "文件:" + fileName
+ ",上传文件扩展名是不允许的扩展名:" + fileExt + "<br/>";
break;
}
// 检查文件大小
if (item.getSize() == 0) {
continue;
}
if (item.getSize() > 1024 * 1024 * 100) {
System.out.println("上传文件大小:" + item.getSize());
message = message + "文件:" + fileName + ",上传文件大小超过限制大小:"
+ upload.getFileSizeMax() + "<br/>";
break;
}
// 得到存文件的文件名
String saveFileName = fileName;
System.out.println("存文件的文件名:" + saveFileName);
// 获取上传文件的输入流
InputStream is = item.getInputStream();
// 创建一个文件输出流
FileOutputStream out = new FileOutputStream(savePath + "/"
+ saveFileName);
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标致
int len = 0;
while ((len = is.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
// 关闭输出流
out.close();
// 关闭输入流
is.close();
// 删除临时文件
item.delete();
message = message + "文件:" + fileName + ",上传成功<br/>";
}
}
} catch (FileSizeLimitExceededException e) {
message = message + "上传文件大小超过限制<br/>";
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
request.setAttribute("message", message);
request.getRequestDispatcher("/message.jsp").forward(request,
response);
}