Struts2中的文件上传,方式很多,大体原理不变。一种是通过POST请求上传,另一种Struts2封装好的字段驱动的方式上传。
1.第一种:
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
|
public String uploadImage() {
boolean result = false ;
/**
*获取request对象,在Struts2或者Servlet中同理
*/
HttpServletRequest req = ServletActionContext.getRequest();
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository( new File(getUploadFileSavePath(req)));
factory.setSizeThreshold( 1024 * 1024 * 2 );
ServletFileUpload upload = new ServletFileUpload(factory);
List<?> items = null ;
try {
items = upload.parseRequest(req);
} catch (FileUploadException e1) {
e1.printStackTrace();
}
for ( int i = 0 ; i < items.size(); i++) {
FileItem item = (FileItem) items.get(i);
if (item.isFormField()) {
continue ;
} else {
String fileName = item.getName();
/**
*StringUtils工具生成时间戳作为文件名,可扩展
*/
String dstFile = StringUtils.timeStamp()
+ fileName.substring(fileName.lastIndexOf( '.' ));
String dstFileName = getUploadFileSavePath(req)
+ File.separator + dstFile;
FileOutputStream fos;
try {
fos = new FileOutputStream(dstFileName);
if (item.isInMemory()) {
InputStream in;
in = item.getInputStream();
byte [] btn = new byte [ 1024 ];
int size;
while ((size = in.read(btn)) > 0 ) {
fos.write(btn, 0 , size);
}
in.close();
fos.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
|
依赖的上传组件是:org.apache.commons.fileupload
原理:通过请求来判断Form中的字段类型,属于文件类型则上传文件。
2.第二种:
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
|
public class UploadAction extends ActionSupport {
private static final long serialVersionUID = 7545315675701301471L;
/**
* 上传文件
*/
private File ccImage;
/**
* 下面的两个字段因ccImage字段存在,而且命名分别是xxxContentType,xxxFileName
*/
/**
* 文件类型(Meta信息)
*/
private String ccImageContentType;
/**
* 上传的文件名
*/
private String ccImageFileName;
private HttpServletRequest request = ServletActionContext.getRequest();
/**
* 获取工程的访问URL根路径:例如:http://127.0.0.1:8080/工程名
*/
private String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath();
/**
* 上传文件
*
* @return
*/
public String upload() {
boolean result = false ;
String dstFile = StringUtils.timeStamp()
+ ccImageFileName.substring(ccImageFileName.lastIndexOf( '.' ));
String dstFileName = getUploadFileSavePath() + File.separator + dstFile;
File destFile = new File(dstFileName);
try {
FileUtils.copyFile(ccImage, destFile);
} catch (IOException e) {
e.printStackTrace();
}
return result ? Action.SUCCESS : Action.ERROR;
}
/**
* 获取上传文件的路径
*
* @return
*/
private String getUploadFileSavePath() {
@SuppressWarnings ( "deprecation" )
/**
* Const.UPLOAD_HEAD_PATH:可配置的变量
*/
String path = request.getRealPath(Const.UPLOAD_HEAD_PATH);
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
return path;
}
/**
* Struts2对于上传文件进行了封装,set方法必须存在,通过set方法和为字段进行赋值
* @return
*/
public String getCcImageContentType() {
return ccImageContentType;
}
public void setCcImageContentType(String ccImageContentType) {
this .ccImageContentType = ccImageContentType;
}
public File getCcImage() {
return ccImage;
}
public void setCcImage(File ccImage) {
this .ccImage = ccImage;
}
public String getCcImageFileName() {
return ccImageFileName;
}
public void setCcImageFileName(String ccImageFileName) {
this .ccImageFileName = ccImageFileName;
}
public String getBasePath() {
return basePath;
}
public void setBasePath(String basePath) {
this .basePath = basePath;
}
} |
上面的UploadAction类中的属性有File,String其中后两个属性因为第一个属性存在而存在,有一定的关联性,这里既可以看成是属性驱动,也可以是模型驱动。Struts2对文件上传的这个过程进行了很好的封装,这里注意属性的命名和set方法即可。
Struts上传文件配置:
1
2
|
<!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) --> < constant name = "struts.multipart.maxSize" value = "2097152" />
|
Action的配置
1
2
3
4
|
< interceptor-ref name = "fileUpload" >
< param name = "allowedTypes" >image/bmp,image/png,image/gif,image/jpeg</ param >
</ interceptor-ref >
< interceptor-ref name = "defaultStack" />
|
关于Struts的文件上传拦截器参见类:
org.apache.struts2.interceptor.FileUploadInterceptor
末了:写这篇文章,不在内容,在意义,在开发中上传文件遇到了一些问题,百度了一下,很多都是泊来品,于是回到官方文档,很多问题都是能解决了,纪念一下,警示自己少百度,少谷歌,溯本逐源才能做好真学问。
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1303172,如需转载请自行联系原作者