场景:我正在开发 .Net 8 API,我需要通过 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 () {
}
})
Controller
:
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 = "")
无济于事。
有什么帮助吗?
编辑1:我真正需要做的事情。
为了简单起见,我缩短了代码,但实际上
what I really need to do
是传递一个类型的数组:
[string, file]
到控制器,其中“字符串”将包含文件的自定义名称和“文件”文件对象本身。
好的,我自己找到了答案,感谢:
关键是下一个:
不必对整个数组执行一个 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]);
编码快乐!