2015-05-26 102 views
0

出於某種原因,我有一個問題反序列化使用multipart/form-data類型發送的數據。這是一個MVC 5項目,數據未映射到控制器方法中。奇怪的是,在Fiddler中所有的數據看起來都沒有問題。但是,在調試時我可以清楚地看到參數都是空的。MVC 5 Ajax文件上傳不反序列化在控制器

這是將一個文本字段(隱藏)和最多兩個文件發送到控制器的表單。下面是簽名:

[HttpPost] 
public async Task<ActionResult> UploadFile(string id, FormCollection form, IEnumerable<HttpPostedFileBase> files) 

我認爲是無關這個問題,因爲這個問題是不被填充參數的方法的實現。

沒有張貼混亂,在這裏實際的文件內容是小提琴手輸出的刪節版本:

POST http://localhost:52876/Projects/UploadFile/5550cdc52300560f6c7b36eb HTTP/1.1 
Host: localhost:52876 
Connection: keep-alive 
Content-Length: 90889 
Authorization: Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIGAbEdAAAADwAbnJriMKEzkS3OifgoahejEgQQAQAAAPUXp1AtIpqEAAAAAA== 
Accept: */* 
Origin: http://localhost:52876 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36 
Content-Type: multipart/form-data 
DNT: 1 
Referer: http://localhost:52876/Projects/ProjectSetupForm/5550cdc52300560f6c7b36eb 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en;q=0.8 
Cookie: donotshowgettingstarted=%7B%22state%22%3Atrue%7D; __RequestVerificationToken=UnL5s7w5OYKgywE5L8jqwbH8PulgF0BG0Ne_qZV5QMOj7pWdXw6qzN1pRYqc4rwKYiWveltrBs1SmJe2o7ndXufkOJFrC1wHOoK2zAXdnQw1 

------WebKitFormBoundaryB3sb0uQDOIiNQXCD 
Content-Disposition: form-data; name="__RequestVerificationToken" 

    f25ipWgwweX4S9Y6aEnQdxGCsvr7D3RznTui8_b5paCT1uTV8UNG0d6zJDXKUWYPHISOKmgD24KH206x_PGQ3KpXlG9YgOL-qqJ8v7DPETVfGk2PvsFm2aKuAS3xAYZI0 
------WebKitFormBoundaryB3sb0uQDOIiNQXCD 
Content-Disposition: form-data; name="files"; filename="MyIcon.bmp" 
Content-Type: image/bmp 

[REDACTED FILE CONTENTS] 

------WebKitFormBoundaryB3sb0uQDOIiNQXCD 
Content-Disposition: form-data; name="files"; filename="" 
Content-Type: application/octet-stream 


------WebKitFormBoundaryB3sb0uQDOIiNQXCD 
Content-Disposition: form-data; name="type" 

output 
------WebKitFormBoundaryB3sb0uQDOIiNQXCD-- 

正如你可以在上面調試數據只有一個文件被髮送看到,文件場空白。我已經過測試,並且在兩者都填充時我都會收到相同的結果。

這裏是一個的被用來捕捉形式的onsubmit JavaScript方法:

$('#attachment-upload form').submit(function (e) { 
    e.preventDefault(); 

    $('#attachment-upload').removeClass('fade').modal('hide'); 
    $('#attachment-progress').modal('show').addClass('fade'); 

    $.ajax({ 
     xhr: function() { 
      var xhr = new window.XMLHttpRequest(); 

      xhr.upload.addEventListener('progress', function (event) { 
       if (event.lengthComputable) { 
        var percent = (event.loaded/event.total) * 100; 
        $('#attachment-progress div.modal-body .progress-bar').width(percent); 
        $('#attachment-progress div.modal-body .progress-bar').attr('aria-valuenow', percent); 
        $('#attachment-progress div.modal-body .progress-bar span').html(percent); 
       } 
      }, false); 

      return xhr; 
     }, 

     url: this.action, 
     type: 'POST', 
     contentType: "multipart/form-data", 
     processData: false, 
     data: new FormData(this), 
     success: function (data) { 
      //my success function here 
     }, 
     error: function (jqxhr, status, error) { 
      $('#upload-progress-section').addClass('hidden'); 
      $('#upload-complete-section').removeClass('hidden'); 

      $('#attachment-progress div.modal-header h1').html("Upload Error"); 
      $('#upload-complete-section p').html("Upload has failed: " + status + " - " + error); 
      $('#attachment-progress div.modal-footer button').removeAttr('disabled'); 
     } 
    }); 
}); 

基於我所看到的提琴手它感到有那麼最有可能的一些錯誤的方法簽名控制器,導致綁定參數失敗。我很驚訝,但FormCollection參數也是null。

是否存在通過ajax使用multipart/form-data上傳文件的已知問題,還是我在這裏做的不正確?

+1

對於初學者來說,你的'Content-Type'請求頭似乎是錯誤的。根據['specification'](http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2),它應該看起來像這樣:'Content-Type:multipart/form-數據;邊界= WebKitFormBoundaryB3sb0uQDOIiNQXCD'。你們似乎錯過了「邊界」部分。 –

+0

@DarinDimitrov非常感謝!這不完全是解決辦法,但它指出我正確的方向!缺少的邊界是問題...內容類型應該被設置爲「false」 – JNYRanger

回答

0

感謝@DarinDimitrov提出的問題是多部分/表單數據內容類型需要定義的邊界。

通過設置$.ajax選項contentType: false而不是將其明確定義爲multipart-form/data,ajax方法能夠自動插入適當的邊界定義,然後控制器能夠正確地反序列化數據。

相關問題