选择 application/x-www-form-urlencoded / multipart/form-data 文件大小(以 GB 为单位)?

What to chose application/x-www-form-urlencoded / multipart/form-data for file size in GB?

我正在发送一些视频文件(大小可能甚至以 GB 为单位)作为 application/x-www-form-urlencoded超过 HTTP POST

以下link link建议当我们有非字母数字内容时,最好通过多部分表单数据传输它。

  1. 这种数据用哪种编码传输比较好?

  2. 另外如何找到编码数据的长度(用application/x-www-form-urlencoded编码的数据)?

  3. 编码二进制数据会不会很费时间?

  4. 一般来说,编码会跳过一些非字母数字字符。那么,我们可以跳过二进制数据(如视频)的编码吗?怎么能跳过呢?

x-www-form-urlencoded 表单数据集 中条目的值视为字节序列(八位字节)。
在可能的 256 个值中,只有 66 个保留原样或仍被编码为单个字节值,其他的被其 code-point 值的十六进制表示形式替换。 这通常需要三到五个字节,具体取决于编码。
因此,平均 (256-66)/256 或 74% 的文件将被编码为 three-to-five 与原始 space 一样多。 然而,这种编码没有 header 也没有显着的开销。

multipart/form-data 而是通过将数据分成几部分,然后找到该部分中没有出现的任意长度的字符串来工作。
这样的字符串称为 boundary,它用于分隔部分的结尾,即作为八位字节流传输。
所以文件主要是按原样发送,对于足够大的数据来说,大小开销可以忽略不计。

缺点是user-agent需要找到一个合适的边界,但是给定一个长度为k的字符串,概率只有2-8k 在统一生成的二进制文件中找到该字符串。
因此 user-agent 可以简单地生成一个随机字符串并进行快速搜索,并利用网络传输时间来隐藏搜索的延迟。


  1. 你应该使用 multipart/form-data.
  2. 这取决于您使用的平台,一般来说,如果您无法访问请求 body,您必须 re-perform 对自己进行编码。
  3. 对于 multipart/form-data 编码,有一点通常可以忽略不计(与传输时间相比)的开销。