多部分/forms数据的边界是什么?
我想问一个关于multipart/form-data
。 在HTTP头中,我发现Content-Type: multipart/form-data; boundary=???
Content-Type: multipart/form-data; boundary=???
。
是???
免费由用户定义? 或者它一般来自HTML? 是否可以定义??? = abcdefg
??? = abcdefg
?
是个 ??? 由用户自由定义?
是。
或者从HTML一般?
不, HTML与此无关 。 参见下文。
是否可以定义? = abcdefg?
是。
如果您想将以下数据发送到Web服务器:
name = John age = 12
使用application/x-www-form-urlencoded
就是这样的:
name=John&age=12
正如你所看到的,服务器知道参数用&
分开,如果&
是必需的,它将被编码。
现在,当服务器使用multipart/form-data
接收HTTP请求时,服务器如何知道参数值开始和结束的位置? 使用边界 ,类似于&
。
例如:
--XXX Content-Disposition: form-data; name="name" John --XXX Content-Disposition: form-data; name="age" 12 --XXX--
在这种情况下,边界值是XXX
。 您可以在Content-Type
标题中指定它,以便服务器知道如何拆分发送的数据。
所以,你基本上需要:
- 使用一个不会在发送到服务器的HTTP数据中出现的值。
- 保持一致,并在整个请求中使用相同的值。
问题的确切答案是: 是的,您可以使用任意值作为boundary
参数 ,因为它的长度不超过70个字节,并且只包含7位US-ASCII
(可打印)字符。
如果使用multipart/*
内容types之一,则实际上需要在Content-Type
头中指定boundary
参数,否则服务器(在HTTP请求的情况下)将无法分析有效内容。
您可能还想在您的Content-Type
标头中将charset
参数设置为UTF-8
,除非您可以绝对确定在有效内容数据中只使用US-ASCII
字符集。
RFC2046的一些相关摘录:
-
4.1.2。 字符集参数:
与其他一些参数值不同,字符集参数的值不区分大小写。 默认的字符集,在缺less字符集参数的情况下必须假定为US-ASCII。
-
5.1。 多部分媒体types
如Content-Transfer-Encoding字段[RFC 2045]的定义中所述,对于“multipart”types的实体,不允许除“7bit”,“8bit”或“binary”以外的编码。 在任何情况下,“多部分”边界分隔符和标题字段总是被表示为7位US-ASCII(尽pipe标题字段可按照RFC 2047编码非US-ASCII标题文本),并且身体部分内的数据可以被编码每个适当的身体部位都有Content-Transfer-Encoding字段。
多部分实体的Content-Type字段需要一个参数“boundary”。 然后将边界定界符线定义为完全由两个连字符(“ – ”,十进制值45)组成的行,后跟Content-Type头字段,可选线性空白和终止CRLF的边界参数值。
边界分隔符不得出现在封装的材料中,并且不得超过70个字符,不包括两个主要的连字符。
紧随最后一个身体部位的边界分界线是一个明确的分隔符,表示身体部位不会跟随。 这样的分隔线与先前的分隔线相同,在边界参数值之后加上两个连字符。
这是一个使用任意边界的例子:
Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary" --another cool boundary Content-Disposition: form-data; name="foo" bar --another cool boundary Content-Disposition: form-data; name="baz" quux --another cool boundary--
multipart / form-data包含分隔名称/值对的边界 。 边界就像表单提交时传递的每个名称/值对块的标记一样。 边界自动添加到请求标头的内容types。
enctype =“multipart / form-data”属性的表单将有一个请求头Content-Type:multipart / form-data; 边界— WebKit193844043-h( 浏览器生成vaue )。
通过的有效载荷看起来像这样:
Content-Type: multipart/form-data; boundary=—-WebKitFormBoundary7MA4YWxkTrZu0gW —-WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name=”file”; filename=”captcha” Content-Type: —-WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name=”action” submit —-WebKitFormBoundary7MA4YWxkTrZu0gW
在web服务端,它被@Consumes(“multipart / form-data”)forms使用。
请注意,在使用Chrome邮递员testing您的web服务时,您需要从下拉框中检查表单数据选项(单选button)和文件菜单以发送附件。 将content-type显式提供为multipart / form-data会引发错误。 因为它通过附加可以正常工作的边界来覆盖post-man对curl请求的内容types,所以边界不见了。
请参阅RFC1341 sec7.2多部分内容types