#c# #api #.net-core #asp.net-core-webapi
#c# #API #.net-core #asp.net-core-webapi
Вопрос:
Я хотел бы отправить файл через API. Сервер получит файл и сохранит его на диске сервера. Вопрос в том, что у меня есть два варианта для этого:
- Прочитайте файл как строку и отправьте всю строку в теле запроса
- Используйте многосоставные
Может ли кто-нибудь помочь в плюсах и минусах использования этих двух вариантов.
Ответ №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 больше оригинала, и вам нужно декодировать их на стороне сервера.