Struts2 对文件上传是经过 file upload 拦截器实现的,具体引入方法见这里。然而 File Upload 拦截器彷佛对于 XHR 过来的文件上传请求没法响应。javascript
MMP老子试了半天。html
用ajax + formData 的方式 文件能传出去(在浏览器HTTP请求中能看到)前端
HTML:java
<input id="file" type="file" name="upload"/> <input id="uploadBtn"class="btn-b-m" type="button" value="上传" />
JS:jquery
$("#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); } }); });
后端:Actionajax
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"; } }
拦截器配置这里没展现,(由于有些隐晦)想看能够本身搜索拦截器配置apache
就这样上传struts2 死活那不到文件json
一样的后端代码,我用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