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