2015-05-26 1 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-- 

Как вы можете видеть в приведенных выше данных отладки только один файл посылается и поле файла пустой. Я тестировал и получаю те же результаты, когда они заполнены.

Вот метод JavaScript, который используется для захвата onSubmit формы:

$('#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 также является нулевым.

Существуют ли известные проблемы с использованием файлов загрузки multipart/form-data через ajax, или это то, что я делаю неправильно здесь?

+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 Большое спасибо! Это было не совсем исправление, но оно указывало мне в правильном направлении! Недопустимая граница была проблемой ... content-type должен был быть установлен на 'false' – JNYRanger

ответ

0

Благодаря решению @DarinDimitrov для решения проблемы проблема заключалась в том, что для типа содержимого multipart/form-data требуется определенная граница.

Установив опцию $.ajaxcontentType: false вместо явного определения ее как многочастной формы/данных, метод ajax смог автоматически вставить правильное определение границы, и тогда контроллер смог десериализовать данные должным образом.

Смежные вопросы