Отправка / загрузка файлов через API-интерфейсы — .Net Core

#c# #api #.net-core #asp.net-core-webapi

#c# #API #.net-core #asp.net-core-webapi

Вопрос:

Я хотел бы отправить файл через API. Сервер получит файл и сохранит его на диске сервера. Вопрос в том, что у меня есть два варианта для этого:

  1. Прочитайте файл как строку и отправьте всю строку в теле запроса
  2. Используйте многосоставные

Может ли кто-нибудь помочь в плюсах и минусах использования этих двух вариантов.

Ответ №1:

Это не связано с плюсами и минусами, поэтому в основном для понимания того, что означает multipart

Составные запросы объединяют один или несколько наборов данных в единое тело, разделенное границами. Обычно вы используете эти запросы для загрузки файлов и для передачи данных нескольких типов в одном запросе (например, файл вместе с объектом JSON).

Это означает, что multipart содержит разные разделы информации, разделенные границей (случайное число).

Например:

 POST /upload HTTP/1.1
Content-Length: 428
Content-Type: multipart/form-data; boundary=abcde12345
--abcde12345
Content-Disposition: form-data; name="id"
Content-Type: text/plain
{...Additional plain content goes here...}
--abcde12345
Content-Disposition: form-data; name="address"
Content-Type: application/json
{
  "street": "3, Garden St",
  "city": "Hillsbery, UT"
}
--abcde12345
Content-Disposition: form-data; name="profileImage "; filename="image1.png"
Content-Type: application/octet-stream
{...file content...}
--abcde12345--
  

В этом примере вы можете видеть разное содержимое, отправленное в одном запросе, разделенное границей [boundary=abcde12345]. (Обычный текст, объект Json и содержимое файла)

Раздел содержимого файла здесь используется для отправки данных файла в application / octet-stream (строка в двоичном формате или формате base64), поэтому в основном вы отправляете данные файла в виде строки 🙂 как вы упомянули в первом пункте, но вы можете включить некоторую дополнительную информацию, может бытьновое имя файла, которое нужно сохранить, пользователь, который загрузил этот файл или что вы хотите.

Надеюсь, вы поняли суть.

Ссылка: https://swagger.io/docs/specification/describing-request-body/file-upload/
https://swagger.io/docs/specification/describing-request-body/multipart-requests/

Ответ №2:

Единственное различие на уровне протокола заключается в том, что запросы с составными / данными формы должны соответствовать RFC 2388, в то время как тело запроса с пользовательским типом может быть произвольным.

Использование строки Base64 имеет преимущество при загрузке очень маленьких отдельных изображений. Это легко обрабатывать и позволяет избежать зависимости от Http.IFormFile. Напротив, файлы в кодировке base64 больше оригинала, и вам нужно декодировать их на стороне сервера.