Struts2 文件上傳 對XHR的請求 (ajax + formData 上傳的文件) 拿不到文件

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

相關文章
相關標籤/搜索