Как загрузить IFormFile с дополнительными параметрами - PullRequest
0 голосов
/ 17 октября 2019

У меня есть существующий API, который считывает данные из тела запроса:

[HttpPost]
public async Task<IActionResult> Post([FromBody] CreateVm vm)
{
    if (!ModelState.IsValid) return BadRequest();
    var result = await _service.CreateAsync(vm);
    return Ok(result);
}

Пришло новое требование: клиент хочет отправить изображение вместе с моделью представления. Моей первой мыслью было присоединить IFormFile к запросу, обработать его в другом сервисе и двигаться дальше:

public async Task<IActionResult> Post([FromBody] CreateVm vm, IFormFile file) { /* ... */}

В результате такого подхода я получаю код состояния 415 "НеподдерживаемыйMedia Type "назад.

Используя почтальона, я попытался установить Content-Type на multipart/form-data, но безрезультатно.

Возможно ли такой подход, или мне нужно добавитьbyte[] свойство viewmodel и анализировать изображение оттуда?

1 Ответ

1 голос
/ 17 октября 2019

Я предполагаю, что поскольку это ранее работало до нового требования загрузки файла, который вы отправляете в JSON. (В будущем было бы полезно, если бы вы показали, как вы делаете запрос.)

Файлы могут быть «загружены» через JSON, но они должны быть отправлены в формате, который может быть включенв объекте JSON, а именно: массив JS int или строка в кодировке Base64. ASP.NET Core может справиться с любым из них и свяжет значение с byte[].

. Без кода, который делает запрос, трудно дать вам гораздо больше рекомендаций, но вам, по сути, просто нужнодобавьте свойство byte[] в модель представления, а затем при выполнении запроса прочитайте данные файла и запишите их в JSON в виде массива int или строки в кодировке Base64, соответствующих этому имени свойства. Например, если вы делаете запрос через JavaScript, вы можете использовать File API для получения данных для файла во входных данных для загрузки.

IFormFile только для multipart/form-data закодированных запросов, иВы не можете смешивать и сопоставлять кодировки тела запроса при использовании связывателя моделей. Поэтому вам придется либо прекратить использование JSON, либо отправить файл в объект JSON, как описано выше, вместо использования IFormFile.

...