【发布时间】:2020-11-04 13:06:23
【问题描述】:
我想通过 API 发送文件。服务器将接收文件并将其保存在服务器驱动器上。 问题是我有两个选项可以做到这一点:
- 将文件作为字符串读取并在请求正文中发送整个字符串
- 使用多部分
有人可以帮助了解使用这两个选项的利弊。
【问题讨论】:
标签: c# api .net-core asp.net-core-webapi
我想通过 API 发送文件。服务器将接收文件并将其保存在服务器驱动器上。 问题是我有两个选项可以做到这一点:
有人可以帮助了解使用这两个选项的利弊。
【问题讨论】:
标签: c# api .net-core asp.net-core-webapi
与利弊无关,所以基本上要了解什么是multipart的意思
多部分请求将一组或多组数据组合成一个 身体,被边界隔开。您通常将这些请求用于 文件上传和在一个单一的传输多种类型的数据 请求(例如,带有 JSON 对象的文件)。
这意味着多部分包含由边界(随机数)分隔的不同信息部分。
例如:
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/
【讨论】:
协议级别的唯一区别是多部分/表单数据请求必须遵守RFC 2388,而自定义类型的请求正文可以是任意的。
使用 Base64 字符串对于上传非常小的单个图像具有优势。它易于处理并且避免了对 Http.IFormFile 的依赖。相反,base64编码的文件比原文件大,需要在服务器端解码。
【讨论】: