Struts2 文件上传 对XHR的请求 (ajax + formData 上传的文件) 拿不到文件

  • Post author:
  • Post category:其他


Struts2 对文件上传是通过 file upload 拦截器实现的,具体引入方法见

这里

。然而 File Upload 拦截器似乎对于 XHR 过来的文件上传请求无法响应。

MMP老子试了半天。

用ajax + formData 的方式 文件能传出去(在浏览器HTTP请求中能看到)

HTML:

 <input id="file" type="file" name="upload"/>
 <input id="uploadBtn"class="btn-b-m" type="button" value="上传" />

JS:

$("#uploadBtn").click(function () {
        var formData = new FormData();
        formData.append("upload", $("#file").get(0).files[0]);
        jQuery.ajax({
            enctype: 'multipart/form-data',
            url: '/json/blackWhiteLimit/fileUpload.action',
            type: "post",
            data: formData,
            processData: false,//用于对data参数进行序列化处理 这里必须false
            contentType: false, //必须
            success: function (json) {
                alert("返回数据了" + json);

            }
        });
    });

后端:Action

  
public class FileUploadAction extends BaseAction {

private File upload; // 上传上来的文件(和前端input框中的name值相对应)
private String uploadFileName; // 上传上来文件的文件名(Struts2固定写法XXXFileName)
private String uploadContentType; // 上传上来的文件的文件类型(Struts2固定写法XXXContentType)

// 省略getter Setter


    /**
     * 文件上传服务
     *
     * @return
     */
    public String fileUpload() {
        System.out.println("*******************进入方法****************");
        try {
            // 校验
            if (upload == null || uploadFileName == null || uploadContentType == null) {
                fileUrlJson = "error:没有成功上传文件,请重新选择上传";
                return "fileUrlResult";
            }
            File file = getUpload(); // 拿到前台传过来的文件
            String fileName = getUploadFileName(); // 拿到文件名
            System.out.println("fileName:" + fileName);
       
            // 逻辑省略.....
  
            fileUrlJson = "success"; // 返回成功
            return "fileUrlResult";
        } catch (Exception e) {
            log.error("BlackWhiteLimitAction.fileUpload出现异常:" + e);
            fileUrlJson = "error"; // 返回失败
          return "fileUrlResult";
        }
    }

拦截器配置这里没展示,(因为有些隐晦)想看可以自己搜索拦截器配置

就这样上传struts2 死活那不到文件

同样的后端代码,我用from 表单提交就能拿到。用ajax + fromData 就不行

也有人遇到了同样的问题并给出了解决办法

传送门

Struts2 对文件上传是通过 file upload 拦截器实现的,具体引入方法见

这里

。然而 File Upload 拦截器似乎对于 XHR 过来的文件上传请求无法响应,具体原因未去探究。也希望知道的人给个提示,谢谢。

解决方式:

用:


jquery.form.min.js


(可以自己百度下载)

这个插件是用来提交form表单而不刷新页面的,就像ajax一样

HTML:

<script type="text/javascript" src="/common/js/jquery.form.min.js"></script> <!-- from 表单升级为ajax的包 -->


 <form action = "/json/fileUpload.action" id="uploadFrom" method = "post" enctype = "multipart/form-data">
 上传附件:
<input id="file" type="file" name="upload"/>
<input id="fileBtn"class="btn-b-m" type="submit" value="上传" />
</form>

JS:

$('#uploadFrom').submit(function () {
            var options = {
                dataType: "json",
                beforeSubmit: function () {
                    alert("正在上传");
                }, success: function (result) {
                    alert('成功上传!');
                }, error: function (result) {
                    alert('上传失败!');
                }
            };
            $(this).ajaxSubmit(options);
            return false; //阻止表单默认提交

        });

后端action就能取到了

总结:

如果可以的话,用Struts2最方便的上传文件的方式是



方法一:


前端:From表单提交, 后端用Struts2 集成的 commonUtil FileUpload提供的封装方法 直接写文件(XXX),文件名(XXXFileName),文件类型(XXXContentType)提供getter setter 方法 配置拦截器就能上传文件了 —>

传送门

or

传送门2

Struts2 集成的 commonUtil FileUpload提供的封装方法,配合前端ajax + FormData的方式应该是不行。



方法二:


如果要用异步不刷新的方式的话,还想用Struts2 集成的 commonUtil FileUpload提供的封装方法,可以用


jquery.form.min.js


这个插件将from 表单改成不刷新页面的方式

当然你也可以使用其他插件,或者有其他更好的方法 欢迎告知

参考:

http://mycream.iteye.com/blog/838147

http://jquery.malsup.com/form/

https://blog.csdn.net/funi16/article/details/8238634


转载于:https://my.oschina.net/zjllovecode/blog/2222299