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>                <tdwidth="30%">                    选择文件:                </td>                <tdwidth="70%">                    <inputtype="file"name="upload"id="file_upload"style="width: 360px">                    <spanid="span_upload"></span>                    <imgalt=""src="<%=path %>/img/loading.gif" id="loading" style="display: none; width: 20px; height: 20px">                </td>            </tr>            <tr>                <tdcolspan="2"align="right">                    <inputvalue="上传并解析"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” -->    <packagename="struts2"extends="json-default"namespace="/">        <!-- 上传文件 -->        <actionname="upload"class="fes.andy.frame.action.UploadAction"method="upload">            <paramname="savePath">/upload</param>            <resulttype="json"name="success">                <paramname="contentType">text/html</param>            </result>            <resulttype="json"name="error">                <paramname="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");            }        })        returnfalse;    }); | 
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> */packagefes.andy.frame.action;importjava.io.File;importfes.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> */publicclassUploadAction extendsSelfActionSupport {    privatestaticfinallongserialVersionUID = 1L;    privateFile upload;// 上传文件    privateString uploadContentType;// 上传文件类型的属性    privateString uploadFileName;// 上传文件名    privateString savePath;// 上传路径(struts.xml 中配置的参数)    privateString message = "";    /**     *      * @方法名 :upload<br>     * @方法描述 :上传文件<br>     * @创建者 :Andy.wang<br>     * @创建时间 :2013-9-11上午11:21:51 <br>     * @return 返回类型 :String     */    publicString upload() {        try{            File targetFile = newFile(getServerPath() + savePath);            if(!targetFile.exists()) {                targetFile.mkdirs();            }            targetFile = newFile(targetFile, getUploadFileName());            booleanb = FileUtil.copyPaste(getUpload(), targetFile);            if(b)                message = "文件上传成功,文件名为:"+ uploadFileName + "。";            else                message = "文件上传失败,文件名为:"+ uploadFileName + "。";        } catch(Exception e) {            // TODO: handle exception            e.printStackTrace();        }        returnSUCCESS;    }    publicFile getUpload() {        returnupload;    }    publicvoidsetUpload(File upload) {        this.upload = upload;    }    publicString getUploadContentType() {        returnuploadContentType;    }    publicvoidsetUploadContentType(String uploadContentType) {        this.uploadContentType = uploadContentType;    }    publicString getUploadFileName() {        returnuploadFileName;    }    publicvoidsetUploadFileName(String uploadFileName) {        this.uploadFileName = uploadFileName;    }    publicString getSavePath() {        returnsavePath;    }    publicvoidsetSavePath(String savePath) {        this.savePath = savePath;    }    publicString getMessage() {        returnmessage;    }    publicvoidsetMessage(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     */    publicString getServerPath() {        serverPath = getClass().getProtectionDomain().getCodeSource()                .getLocation().getPath();        serverPath = serverPath.substring(1, serverPath.indexOf("WEB-INF"));        returnserverPath;    } | 
到此,所有的代码都贴上了。通过浏览器测试发现上传第一个文件,能上传成功:
这时服务器路径下,已经创建一个名为“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