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

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 BlackWhiteLimitAction 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

:TODO 回家

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

相关推荐