The best wat I discovered for myself:
export const convertDataToFormDataFormat = (data, formData = null, keyPrefix = '') => {
if (!data) {
return null;
}
let currentFormData = formData || new FormData();
if (Array.isArray(data)) {
data.forEach((entry, i) => {
currentFormData = convertDataToFormDataFormat(entry, currentFormData, `${keyPrefix}[${i}].`);
});
return currentFormData;
}
if (data) {
Object.entries(data).forEach(([key, value]) => {
const fullKey = keyPrefix + key;
if (value === undefined || value === null) {
currentFormData.append(fullKey, '');
} else if (value.constructor === File) {
currentFormData.append(fullKey, value);
} else if (Array.isArray(value)) {
currentFormData = convertDataToFormDataFormat(value, currentFormData, `${fullKey}`);
} else if (value === Object(value)) {
currentFormData = convertDataToFormDataFormat(value, currentFormData, `${fullKey}.`);
} else {
currentFormData.append(fullKey, value);
}
});
}
return currentFormData;
};
Converts to something like this:
fieild.test1= 'test';
fieild.test2= 'test';
field.arr[0].testField1 = 'testField ';
field.arr[0].testField2 = 'testField ';
field.arr[1].testField = 'testField ';
field.arr[1].testField2 = 'testField ';
field.arr[2].testField = 'testField ';
field.arr[2].testField2 = 'testField ';
Works great for asp.net core 2.0:
[HttpPost]
public async Task<IActionResult> CreateExpense([FromForm] List<SomeModelWithIFormFileField> dto)
{
....
}