multipart/* 响应是否必须使用 chunked 编码?
不是必须的。
- 如果服务器在发送响应之前,能够预先知道整个
multipart/*
消息体的总长度(比如,所有部分都已生成并缓存在内存中),那么它可以不使用Transfer-Encoding: chunked
。 - 在这种情况下,服务器会在响应头中设置:
Content-Type: multipart/form-data; boundary=your_unique_boundary_string
Content-Length: <total_length_of_the_entire_multipart_body_in_bytes>
- 然后,服务器一次性将整个
multipart
消息体(作为一个连续的字节流)发送出去。
总结一下:
multipart/*
是一种内容类型,描述的是HTTP消息体内部的数据是如何组织的(分成多个部分,用boundary分隔)。Transfer-Encoding: chunked
是一种传输机制,描述的是HTTP消息体整体是如何在网络上被分段传输的(当总长度未知时)。
它们是正交(orthogonal)的概念:
- 你可以用
chunked
方式传输一个multipart
内容。 - 你也可以用
chunked
方式传输一个text/html
或application/json
内容。 - 你也可以在知道总长度的情况下,不用
chunked
方式(而是用Content-Length
)来传输一个multipart
内容。
因此,multipart
的“底层”不“是” chunked
,但 multipart
的内容可以被 chunked
机制所承载和传输。在流式发送 multipart
内容时,chunked
编码是非常有用的。