最近在开发时,发现客户端的文件上传有两种头:
第一种是带有Content-Length的:
第二种是不带Content-Length的:
一般来讲,上传文件需要在请求头中带上content-length,以告知服务端需要接受的数据包大小。
但HTTP协议中提供了另一种方式,来约定上传边界。就是以分块编码形式来发送数据。
数据发送方式在headers.Transfer-Encoding中表现。
详见:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Transfer-Encoding
文中指出:
(Transfer-Encoding: chunked时)数据以一系列分块的形式进行发送。
Content-Length
首部在这种情况下不被发送。。在每一个分块的开头需要添加当前分块的长度,以十六进制的形式表示,后面紧跟着 '\r\n
' ,之后是分块本身,后面也是'\r\n
' 。终止块是一个常规的分块,不同之处在于其长度为0。终止块后面是一个挂载(trailer),由一系列(或者为空)的实体消息首部构成。
分块编码主要应用于如下场景,即要传输大量的数据,但是在请求在没有被处理完之前响应的长度是无法获得的。例如,当需要用从数据库中查询获得的数据生成一个大的HTML表格的时候,或者需要传输大量的图片的时候。
对服务端来说,应该注意支持这种上传方式。
对nodejs服务端来说,formidable这种库默认支持分块编码上传。但仍需考虑到经过代理、CDN时,上传可能出现的异常。