По какой-то причине у меня возникла проблема десериализации данных, отправляемых с использованием типа 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, или это то, что я делаю неправильно здесь?
Для начала ваш заголовок запроса Content-Type кажется неправильным. Согласно ['specification'] (http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2) он должен выглядеть так:' Content-Type: multipart/form- данные; граница = WebKitFormBoundaryB3sb0uQDOIiNQXCD'. Кажется, что вам не хватает части «границы». –
@DarinDimitrov Большое спасибо! Это было не совсем исправление, но оно указывало мне в правильном направлении! Недопустимая граница была проблемой ... content-type должен был быть установлен на 'false' – JNYRanger