Struts2+ajaxFileUpload+JSP 页面无刷新上传。
所依赖的jar及js有:下载struts2-json-plugin-2.1.8.1.jar;下载ajaxfileupload.js;下载jquery-1.2.6.min.js
直接分享代码:
web.xml(struts2的过滤器部分):
1
2
3
4
5
6
7
8
9
|
< filter > < filter-name >struts2</ filter-name > < filter-class >org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</ filter-class > </ filter > < filter-mapping > < filter-name >struts2</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
upload.jsp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< tr > < td width = "30%" > 选择文件: </ td > < td width = "70%" > < input type = "file" name = "upload" id = "file_upload" style = "width: 360px" > < span id = "span_upload" ></ span > < img alt = "" src="<%=path %>/img/loading.gif" id="loading" style="display: none; width: 20px; height: 20px"> </ td > </ tr > < tr > < td colspan = "2" align = "right" > < input value = "上传并解析" type = "button" id = "btn_upload" align = "middle" style = "width: 100px; height: 30px" > </ td > </ tr > |
struts.xml(上传文件部分的配置):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- 注意:包继承 “json-default” --> < package name = "struts2" extends = "json-default" namespace = "/" > <!-- 上传文件 --> < action name = "upload" class = "fes.andy.frame.action.UploadAction" method = "upload" > < param name = "savePath" >/upload</ param > < result type = "json" name = "success" > < param name = "contentType" >text/html</ param > </ result > < result type = "json" name = "error" > < param name = "contentType" >html/html</ param > </ result > </ action > </ package > |
upload.js:
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
|
/** * 上传并解析按钮 */ $( "#btn_upload" ).click( function (){ $( "#loading" ).ajaxStart( function (){ $( this ).show(); // 开始上传 }).ajaxComplete( function (){ $( this ).hide(); // 上传结束 }); $.ajaxFileUpload({ url: "upload" , // 文件上传服务器请求Action secureuri: true , // 安全提交,默认为false fileElementId: "file_upload" , // 文件类型的id dataType: "json" , // 返回值类型 success: function (data){ // 服务器响应成功 $( "#span_title2" ).text(data.message).css( "color" , "red" ); $( "#upload_result" ).show(); $( this ).attr( "src" , "/FESWork/img/right2.png" ); }, error: function (data){ // 服务器响应失败 $( "#span_title2" ).text(data.message).css( "color" , "red" ); } }) return false ; }); |
UploadAction.java:
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
|
/** * @包名 :fes.andy.frame.action<br> * @文件名 :UploadAction.java<br> * @类描述 :<br> * @作者 :Andy.wang<br> * @创建时间 :2013-9-11上午10:24:43<br> * @更改人 :<br> * @更改时间 :<br> */ package fes.andy.frame.action; import java.io.File; import fes.andy.frame.util.FileUtil; /** * @包名 :fes.andy.frame.action<br> * @文件名 :UploadAction.java<br> * @类描述 :上传Jsp文件的Action<br> * @作者 :Andy.wang<br> * @创建时间 :2013-9-11上午10:24:43<br> * @更改人 :<br> * @更改时间 :<br> */ public class UploadAction extends SelfActionSupport { private static final long serialVersionUID = 1L; private File upload; // 上传文件 private String uploadContentType; // 上传文件类型的属性 private String uploadFileName; // 上传文件名 private String savePath; // 上传路径(struts.xml 中配置的参数) private String message = "" ; /** * * @方法名 :upload<br> * @方法描述 :上传文件<br> * @创建者 :Andy.wang<br> * @创建时间 :2013-9-11上午11:21:51 <br> * @return 返回类型 :String */ public String upload() { try { File targetFile = new File(getServerPath() + savePath); if (!targetFile.exists()) { targetFile.mkdirs(); } targetFile = new File(targetFile, getUploadFileName()); boolean b = FileUtil.copyPaste(getUpload(), targetFile); if (b) message = "文件上传成功,文件名为:" + uploadFileName + "。" ; else message = "文件上传失败,文件名为:" + uploadFileName + "。" ; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return SUCCESS; } public File getUpload() { return upload; } public void setUpload(File upload) { this .upload = upload; } public String getUploadContentType() { return uploadContentType; } public void setUploadContentType(String uploadContentType) { this .uploadContentType = uploadContentType; } public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uploadFileName) { this .uploadFileName = uploadFileName; } public String getSavePath() { return savePath; } public void setSavePath(String savePath) { this .savePath = savePath; } public String getMessage() { return message; } public void setMessage(String message) { this .message = message; } } |
SelfActionSupport.java中的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/** * * @方法名 :getServerPath<br> * @方法描述 :获取服务器路径<br> * @创建者 :Andy.wang<br> * @创建时间 :2013-9-11上午11:11:49 <br> * @return 返回类型 :String */ public String getServerPath() { serverPath = getClass().getProtectionDomain().getCodeSource() .getLocation().getPath(); serverPath = serverPath.substring( 1 , serverPath.indexOf( "WEB-INF" )); return serverPath; } |
到此,所有的代码都贴上了。通过浏览器测试发现上传第一个文件,能上传成功:
这时服务器路径下,已经创建一个名为“upload”的文件夹,且选择上传的文件已经成功上传到该文件夹下。该文件夹在struts.xml里配置的路径”<param name=”savePath”>/upload</param>“。但是,再选择一个文件上传时,会发现报错,错误是找不到Action,如图
第一个url是第一次上传输出的,是正确的;第二个url是第二次上传输出的,是错误的,直接导致”找不到Action“。但是如果把服务器路径下的”upload“文件夹删掉,再选择文件上传时,重新创建一个”upload“文件夹,上传也能成功,然后就再上传还是这个错误,至今不知道是什么原因?如果哪位大牛看到了,还望相告。
出现问题总是要解决的:
方法一:
在UploadAction类中有这样一句话:File targetFile = new File(getServerPath() + savePath),修改为:File targetFile = new File(getServerPath())就可以了。也就是说在服务器路径下不创建”upload“文件夹,那么所有上传的文件都直接在项目目录下。这种办法是可以的,但是上传文件过多的话,服务器会很乱。
方法二:
在upload.js里$.ajaxFileUpload()方法中有这样一句话:url:”upload”,修改为url:”upload.action”就可以了。这样每次请求的url都是”http://localhost:8888/FESWork/upload“,也是正确的url。
http://my.oschina.net/andy1989/blog/161124