Избегайте встраивания IFormFile
в класс Upload
.При загрузке чего-то вроде IList<Upload>
, где его элемент списка имеет свойство IFormFile
, вы можете столкнуться с ошибкой , которая приводит к сумасшедшей утечке памяти (Он съел мне около 6,7 Гб памяти, пока я к нему не обратился).Для получения дополнительной информации см.
Самый простой способ обойти это, как WahidBitar комментирует GitHub , - это создать оболочку для получения полезной нагрузки.
Что касается самого вопроса, вам следует избегать встраивания IFormFile
в класс Upload
.
Вот рабочий пример:
public class UploadPayload{
public IList<Upload> Uploads{get;set;}
public class IFormFileWrapper {
public IFormFile File { get; set; }
}
public class Upload
{
// See https://github.com/aspnet/Mvc/issues/8782
<strike>public IFormFile File { get; set; }</strike>
public IFormFileWrapper CodigoFile { get; set; }
public string CodigoVendaArquivo { get; set; }
public string CodigoClienteArquivo { get; set; }
public string Checkbox { get; set; }
}
}
А также измените свой метод действий, как показано ниже:
<strike>public JsonResult Upload([FromBody] List listUpload)</strike>
public IActionResult Upload(UploadPayload listUpload)
{
...
}
Сторона клиента:
Чтобы создать formData
, создайте getFormData()
функцию:
function getFormData(listUpload){
var formData = new FormData();
function getFieldName(index,name){
return "Uploads[" + index + "]." + name ;
};
function getFileName(index,name){
return "Uploads[" + index + "].CodigoFile." + name ;
};
for(var i =0 ;i <listUpload.length; i++){
var upload = listUpload[i];
formData.append(getFieldName(i, 'CodigoVendaArquivo'), upload.CodigoVendaArquivo);
formData.append(getFieldName(i, 'CodigoClienteArquivo'), upload.CodigoClienteArquivo);
formData.append(getFieldName(i, 'Checkbox'),upload.Checkbox)
formData.append(getFileName(i, 'File'), upload.File);
}
return formData;
}
Теперь мы можем отправить formData следующим образом:
jQuery('#tblDocuments > tbody > tr').each(function () {
...
listUpload.push(Upload);
}
var formData = getFormData(listUpload);
fetch('../../upload', {
method: 'POST',
headers: {
'Accept': 'application/json',
<strike>'Content-Type': 'application/json'</strike>
},
<strike>body: JSON.stringify(listUpload),</strike>
body:formData,
})
.then(res => res.json())
.then(res => {
if (res == 1) {
// success
}
});