文件上传API:Multipart/form-data和body中的原始内容有什么区别?

16

我发现至少有两种方法可以通过API将文件上传到HTTP服务器。

一种是使用multipart/form-data(这是浏览器原生支持的文件上传HTML输入框的方式),但你也可以在请求体内使用POST发送文件内容(可能需要正确的Content-Type请求头)。

每种方式的优缺点是什么(不仅限于浏览器)?例如,使用多部分请求可能会更复杂一些,取决于您在编程环境中使用的http或网络库(我在服务器端使用Node.js,在客户端使用Swift)。


请访问以下链接查看有关在现代浏览器中上传文件的最佳方法的问题:https://dev59.com/Ll0b5IYBdhLWcg3wENiK - vtortola
@vtortola 这并不是这个问题的答案。我不是在询问任何客户端网络实现,只是关于HTTP方法的问题。 - julien_c
1个回答

24

在协议层面上唯一的区别是,multipart/form-data 请求必须遵守 RFC 2388,而自定义请求体可以是任意的。

从实际角度来看,multipart/form-data 请求通常更大:虽然客户端从技术上允许使用非7位 content-transfer-encoding,但大多数情况下会使用 base64。 MIME 头会产生额外的开销,如果上传了许多小文件,这可能成为瓶颈。请注意,现有客户端/库中对于 multipart/form-data 文件上传的支持更加广泛。如果您不确定客户端和中间主机(代理服务器)的功能集,请始终提供它作为备用选项。特别要记住,如果您为第三方设计 API,则其他开发人员已经熟悉 multipart/form-data 并且具有可用于处理该请求类型的库。


1
需要一个有主观态度的答案,而不是“根据这些东西你自己决定”。 - Jus12
如果不确定,就选择“multipart/form-data”。 - Phillip
我很可能没有理解这个答案。从你的话中看来,在上传文件时使用多部分表单数据时,浏览器通常使用base64编码,这是不正确的,应该使用原始二进制格式。你发布的RFC链接说:“邮件传输的默认编码是7BIT”,但对于文件没有任何说明。 - Giacomo Cerquone
值得注意的是,这取决于文件来自哪里。如果文件始终来自前端UI,则多部分表单数据是有意义的。如果文件来自后端服务器,则不太可能将其打包为多部分表单数据。 - Llama D'Attore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接