Как вы уже заметили, использование опции 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);
}
}