我想问一个关于的问题multipart/form-data
。在HTTP标头中,我发现Content-Type: multipart/form-data; boundary=???
。
是???
免费的由用户来定义?还是从HTML生成?我可以定义??? = abcdefg
吗?
我想问一个关于的问题multipart/form-data
。在HTTP标头中,我发现Content-Type: multipart/form-data; boundary=???
。
是???
免费的由用户来定义?还是从HTML生成?我可以定义??? = abcdefg
吗?
Answers:
是
???
免费的由用户来定义?
是。
还是由HTML提供?
第HTML有没有做到这一点。参见下文。
我可以定义
???
asabcdefg
吗?
是。
如果要将以下数据发送到Web服务器:
name = John
age = 12
使用application/x-www-form-urlencoded
将是这样的:
name=John&age=12
如您所见,服务器知道参数之间用&分隔&
。如果&
需要参数值,则必须对其进行编码。
那么,当服务器使用接收HTTP请求时,服务器如何知道参数值的开始和结束位置multipart/form-data
?
使用边界,类似于&
。
例如:
--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/*
内容类型,则实际上需要boundary
在Content-Type
标头中指定参数,否则服务器(对于HTTP请求)将无法解析有效负载。
除非您完全确定在有效载荷数据中仅使用字符集,否则您可能还希望在标头中将该charset
参数设置为。UTF-8
Content-Type
US-ASCII
RFC2046的一些相关摘录:
4.1.2。字符集参数:
与某些其他参数值不同,charset参数的值不区分大小写。在没有字符集参数的情况下必须假定的默认字符集是US-ASCII。
5.1。多部分媒体类型
如内容传输编码字段[RFC 2045]的定义中所述,类型“ multipart”的实体除“ 7bit”,“ 8bit”或“ binary”外不允许编码。在任何情况下,“多部分”边界定界符和标头字段始终表示为7位US-ASCII(尽管标头字段可以根据RFC 2047编码非US-ASCII标头文本),并且正文部分中的数据可以在基于每个部分的内容,其中每个适当的身体部位都有Content-Transfer-Encoding字段。
多部分实体的“内容类型”字段需要一个参数“边界”。然后将边界定界符线定义为完全由两个连字符(“-”,十进制值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包含用于分隔名称/值对的边界。边界就像提交表单时传递的每个名称/值对块的标记一样。边界自动添加到请求标头的内容类型。
具有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--
在网络服务方面,它以@Consumes(“ multipart / form-data”)形式使用。
当心,当使用chrome postman测试您的Web服务时,您需要检查下拉菜单中的表单数据选项(单选按钮)和“文件”菜单以发送附件。内容类型作为multipart / form-data的显式提供会引发错误。因为缺少边界,因为它通过附加可以正常工作的边界来覆盖邮递员对具有内容类型的服务器的卷曲请求。