ASPNetCore - загрузка файла через REST - PullRequest
0 голосов
/ 08 мая 2018

Я использую Insomnia для тестирования API, но то же самое происходит с Почтальоном.

Я хочу проверить загрузку файла со следующим контроллером:

public async Task<IActionResult> Post([FromForm]IFormFile File)

Если я установлю запрос как составной запрос:

enter image description here

это работает.

Однако, если я установлю его как двоичный файл:

enter image description here

Я не знаю, как получить данные. Как это можно сделать?

Кроме того, в сигнатуре метода контроллера, если я изменю [FromForm] на [FromBody], я не получаю данные.

Может кто-нибудь уточнить это для меня?

1 Ответ

0 голосов
/ 14 мая 2018

Как вы уже заметили, использование опции binary file в Почтальоне / Бессоннице не работает стандартным способом. Существует три способа загрузки файла через RESTful API, и вам нужно выбрать один.

Я включил фрагменты кода, которые считывают содержимое загруженного файла в строку и выводят ее - попробуйте отправить текстовый файл, и вы должны получить содержимое файла в ответе 200.

Загрузка данных формы

Это самый популярный / известный метод загрузки, форматирующий отправляемые вами данные в виде набора пар ключ / значение. Обычно в запросе необходимо указать от Content-Type до multipart/form-data, а затем использовать атрибут [FromForm] в MVC для привязки значений к переменным. Также вы можете использовать встроенный класс IFormFile для доступа к загруженному файлу.

[HttpPost]
public async Task<IActionResult> PostFormData([FromForm] IFormFile file)
{
    using (var sr = new StreamReader(file.OpenReadStream()))
    {
        var content = await sr.ReadToEndAsync();
        return Ok(content);
    }
}

Загрузка тела

Вы можете отправить тело в формате, понятном MVC, например, JSON, и вставьте файл в него. Обычно содержимое файла кодируется с использованием Base64 или другой кодировки, чтобы предотвратить проблемы кодирования / декодирования символов, особенно если вы отправляете изображения или двоичные данные. Э.Г.

{
    "file": "MTIz"
}

А затем укажите [FromBody] внутри вашего контроллера и используйте класс для десериализации модели.

[HttpPost]
public IActionResult PostBody([FromBody] UploadModel uploadModel)
{
    var bytes = Convert.FromBase64String(uploadModel.File);
    var decodedString = Encoding.UTF8.GetString(bytes);
    return Ok(decodedString);
}
// ...
public class UploadModel
{
    public string File { get; set; }
}

При использовании больших и нетекстовых файлов запрос JSON становится громоздким и трудным для чтения.

Двоичный файл

Ключевым моментом здесь является то, что ваш файл представляет собой полный запрос . Запрос не содержит никакой дополнительной информации, чтобы помочь MVC связать значения с переменными в вашем коде. Поэтому, чтобы получить доступ к файлу, вам нужно прочитать Body в Request.

[HttpPost]
public async Task<IActionResult> PostBinary()
{
    using (var sr = new StreamReader(Request.Body))
    {
        var body = await sr.ReadToEndAsync();
        return Ok(body);
    }
}
...