本篇主要使用Struts2实现文件的上传与动态下载功能。出于安全考虑,所以,在硬盘上存储上传的文件的时候,统一都重新命名为随机字符串。用数据库存储真实文件名与随机文件名称之间的关联。
下面的是实体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
class
FileBag
implements
java.io.Serializable {
// Fields
private
Integer id;
//Id编号
private
String filePath;
//文件存储路径(真实的文件被重命名后的名称)
private
Date fileIndate;
//文件上传日期
private
Integer downloadCount;
//文件下载次数
private
String fileMark;
//文件备注,说明
private
String fileSize;
//文件大小
private
String fileType;
//文件类型
private
String fileName;
//真实的文件名称
//getter 和setter省略
}
|
然后写页面,页面其实很简单:
1
2
3
4
5
6
7
8
9
10
11
|
<
form
method
=
"post"
action
=
"fileUploadAction.action"
enctype
=
"multipart/form-data"
>
<
div
id
=
"chooser"
>
文 件:<
input
id
=
"file"
type
=
"file"
name
=
"file"
/><
br
/>
文件描述:<
textarea
id
=
"fileremark"
name
=
"fileremark"
></
textarea
><
br
/>
</
div
>
<
input
type
=
"submit"
value
=
"上传"
/>
</
form
>
|
然后写Action,前面提到过,出于安全考虑,所以,在硬盘上存储上传的文件的时候,统一都重新命名为随机字符串。用数据库存储真实文件名与随机文件名称之间的关联。
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
|
package
com.action;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.util.Date;
import
java.util.List;
import
org.apache.struts2.ServletActionContext;
import
org.springframework.beans.factory.annotation.Autowired;
import
com.common.base.BaseAction;
import
com.common.util.Configuration;
import
com.common.util.FileExtensionHelper;
import
com.common.util.StringUtils;
import
com.entity.FileBag;
import
com.opensymphony.xwork2.ModelDriven;
import
com.service.FileBagService;
//该类支持多文件上传
public
class
FileUploadAction
extends
BaseAction {
@Autowired
private
FileBagService fileBagService;
private
List<File> file;
//Struts2文件上传不可缺少
private
List<String> fileFileName;
//Struts2文件上传不可缺少
private
List<String> fileContentType;
//Struts2文件上传不可缺少
private
List<String> fileremark;
public
List<File> getFile() {
return
file;
}
public
void
setFile(List<File> file) {
this
.file = file;
}
public
List<String> getFileFileName() {
return
fileFileName;
}
public
void
setFileFileName(List<String> fileFileName) {
this
.fileFileName = fileFileName;
}
public
List<String> getFileContentType() {
return
fileContentType;
}
public
void
setFileContentType(List<String> fileContentType) {
this
.fileContentType = fileContentType;
}
/**
* 执行文件上传的操作,会自动生成一个带随机文件名的字符串来防止重复文件。
*/
public
String execute()
throws
Exception {
for
(
int
i =
0
; i < file.size(); i++) {
FileBag fileBag =
new
FileBag();
//创建一个新的实例存储文件信息
fileBag.setFileIndate(
new
Date());
//设定文件上传日期
fileBag.setFileMark(fileremark.get(i));
//设定文件的备注信息
fileBag.setFileName(fileFileName.get(i));
//设定文件的真实名称
fileBag.setDownloadCount(
0
);
//设定文件下载次数为0
fileBag.setFileSize(file.get(i).length()+
""
);
String fileRandomName = StringUtils.randomString(
20
);
//随机产生文件名称的字符串
fileBag.setFilePath(fileRandomName);
//设定文件的随机名称
fileBag.setFileType(
this
.fileContentType.get(i));
//设定文件类型
InputStream in =
new
FileInputStream(file.get(i));
//从Configuration类中获取设定的文件存储路径(常量),下载的时候也会用到这个存储地址
String root = Configuration.getValue(
"fileSaveDir"
);
File file =
new
File(root);
if
(!file.exists()){
//如果目录不存在,则会重新创建目录
file.mkdirs();
System.out.println(
"重新创建目录!"
);
}
File destFile =
new
File(root, fileRandomName);
OutputStream out =
new
FileOutputStream(destFile);
byte
[] b =
new
byte
[
1024
];
int
length =
0
;
while
((length = in.read(b)) >
0
) {
out.write(b,
0
, length);
}
in.close();
out.close();
fileBagService.save(fileBag);
}
this
.msg=
this
.file.size()+
"个文件上传成功!"
;
return
SUCCESS;
}
public
List<String> getFileremark() {
return
fileremark;
}
public
void
setFileremark(List<String> fileremark) {
this
.fileremark = fileremark;
}
}
|
设定Struts2的配置
1
2
|
struts.multipart.saveDir=D\:\\ 设定临时文件存储位置
struts.multipart.maxSize=
105591603200
//设置文件最大上传多少兆,这里单位是字节
|
Struts.xml中对Action的配置
1
2
3
4
5
6
7
|
<!-- 文件上传 -->
<action name=
"fileUploadAction"
class
=
"com.action.FileUploadAction"
>
<result name=
"success"
>/file/fileupload.jsp</result>
<result name=
"input"
>/file/fileupload.jsp</result>
</action>
//写到这里,文件上传这块儿就完成了。
由于篇幅问题,这个文件上传就写到这里吧。
|