Я работаю над API .Net 8, и мне нужно передать данные формы, состоящие из файлов и других элементов формы, в контроллер через ajax.
Мне удается успешно передать один файл, но странно то, что я не могу передать массив файлов.
(Я сократил код для простоты)
JavaScript:
let arrayFiles = [];
arrayFiles.push(fileSelector.files[0]);
formData.append('files', arrayFiles[0]);
formData.append('test', test);
formData.append('saveMode', saveMode);
formData.append('deletedElements', deletedElements);
$.ajax({
url: '/Test/SaveTest',
method: 'POST',
contentType: false,
processData: false,
data: formData,
success: function (res) {
},
error: function () {
}
})
Контроллер:
public async Task<JsonResult> SaveTest(string test, int saveMode, IFormFile files, string deletedElements = "")
{
var deletedQuestions = deletedElements.DeserializeNodeToList<QuestionDTO>("DeletedQuestions");
var deletedAnswers = deletedElements.DeserializeNodeToList<AnswerDTO>("DeletedAnswers");
var testDto = test.DeserializeTest(deletedQuestions, deletedAnswers);
if (testDto == null) return Json(new { Success = false });
var saveResult = await _service.CreateTestAsync(testDto, saveMode);
return Json(saveResult);
}
Таким образом, я без проблем получаю один объект IFormFile из формы, но дело в том, что мне нужно передать несколько файлов.
Я пытался:
formData.append('files', arrayFiles); //removed the index to pass the whole array
плюс:
public async Task<JsonResult> SaveTest(string test, int saveMode, IFormFile[] files, string deletedElements = "")
или
public async Task<JsonResult> SaveTest(string test, int saveMode, List<IFormFile> files, string deletedElements = "")
но безрезультатно.
Я сократил код для простоты, но на самом деле мне нужно передать массив типа:
[string, file]
в контроллер, где «строка» будет содержать настроенное имя файла и «файл» — сам файловый объект.





Хорошо, я нашел ответ сам благодаря:
Отправьте массив файлов из Jquery ajax в действие контроллера
Ключ следующий:
Вместо того, чтобы выполнять один FormData.append со всем массивом, вам нужно добавить столько изображений, сколько изображений вам нужно передать, сохраняя один и тот же ключ, поэтому вместо (например):
let arrayFiles = [];
arrayFiles.push(fileSelector.files[0]);
arrayFiles.push(fileSelector.files[1]);
formData.append('files', arrayFiles);
Вы будете делать:
let arrayFiles = [];
arrayFiles.push(fileSelector.files[0]);
arrayFiles.push(fileSelector.files[1]);
formData.append('files', arrayFiles[0]);
formData.append('files', arrayFiles[1]);