asp net core Формирование модели с IFormFile и доп. информацией (FormData)
У меня есть приложение-чат. Хочу реализовать отправку сообщений через asp net контроллер:
[HttpPost]
[Route("SendMessage")]
public IActionResult SendMessage([FromForm] InputMessage inputMessage)
{
// Логика какая-то
}
Модель
В ней у меня есть сам текст сообщения и перечисление файлов.
public class InputMessage
{
public string MessageText { get; set; }
public IEnumerable<IFormFile>? Attachments { get; set; }
}
На клиенте создаю эту модель и отправляю в дальнейшем в тот контроллер
export const createInputMessageFormData = (message: InputMessage): FormData => {
const formData: FormData = new FormData();
formData.set("MessageText", message.messageText);
message.attachments.forEach(attachment => {
formData.append("Attachments", attachment.file);
});
return formData;
}
Все прекрасно работает, НО: В модели нет указания типа файла: фотография, .exe или еще что-либо.
Как я могу в formData впихнуть тип к каждому отдельному файлу? Не получается это сделать просто:
message.attachments.forEach(attachment => {
formData.append("Attachments", attachment); // !attachment имеет указание типа файла! attachment.type
});
formData принимает только строки или blob. Как мне их иерархически вложить друг в друга, чтоб получить примерно следующее в итоговой модели:
public class InputMessage
{
public string MessageText { get; set; }
public IEnumerable<Attachment>? Attachments { get; set; }
}
public class Attachment
{
public string Type { get; set; } // image, .exe, .excel и прочее
public IFormFile File {get; set; }
}
Рассматриваю вариант, чтоб просто сделать еще одно поле - словарь<имя_файла, тип>, чтоб потом на сервере перебирать все и соотносить, но это ведь не лучшее решение, так?
upd: задача сводится просто к тому, чтоб в form-data добавить сложный объект типа Attachment, который я описал выше на C#, но как его сериализовать в form-data?
Ответы (1 шт):
Решил проблему, изменив лишь формирование FormData:
message.attachments.forEach((attachment, index) => {
formData.append(`Attachments[${index}].File`, attachment.file);
formData.append(`Attachments[${index}].Type`, attachment.type);
});
public class InputMessage
{
public string MessageText { get; set; }
public IEnumerable<Attachment>? Attachments { get; set; }
}
public class Attachment
{
public string Type { get; set; } // image, .exe, .excel и прочее
public IFormFile File {get; set; }
}