multipart / form-data中的边界是什么?


Answers:


424

???免费的由用户来定义?

是。

还是由HTML提供?

HTML没有做到这一点。参见下文。

我可以定义???as abcdefg吗?

是。

如果要将以下数据发送到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数据中出现的值。

  • 保持一致,并在请求消息中的所有位置使用相同的值。


54
您必须在边界的末尾添加一个额外的“-”。
塞巴斯蒂安·皮斯科尔斯基

13
您可以在文档中阅读。边界结尾必须有两个额外的连字符“-”链接:w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Sebastian Piskorski 2014年

6
好答案。边界只是分隔多部分有效载荷的多个“部分”的“关键”。通常,诸如“&”之类的东西足以分隔变量,但是您需要更独特的东西来分隔有效载荷内的有效载荷。
user2483724 2014年

1
@ K3rnel31当然,除非新的边界字符串具有相同的长度。
奥斯卡·梅德罗斯

5
我认为Content-Type标头中声明的边界值实际上将是-XXX ---,因为在分离各部分时应写一个额外的“-”(因此--- XXX ---)
Theodore K 。

96

问题的确切答案是:是的,您可以为boundary参数使用任意值,因为它的长度不超过70个字节,并且仅由7位US-ASCII(可打印)字符组成。

如果使用一种multipart/*内容类型,则实际上需要boundaryContent-Type标头中指定参数,否则服务器(对于HTTP请求)将无法解析有效负载。

除非您完全确定在有效载荷数据中仅使用字符集,否则您可能还希望在标头中将该charset参数设置为。UTF-8Content-TypeUS-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--

2
我最喜欢这个答案,因为它引用了RFC中有关连字符的指定方式。
里克

@Rick有一个IETF这样做的正当理由-尽管它们看上去几乎相同,但以下四个字符中只有一个是正确的连字符:˗
antichris

哈,当我说出连字符时,是指您的回答告诉我标准中定义了哪些连字符。我对哪些hypen是“客户定义的”和哪些是“规范定义的”感到困惑
Rick

31

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的显式提供会引发错误。因为缺少边界,因为它通过附加可以正常工作的边界来覆盖邮递员对具有内容类型的服务器的卷曲请求。

请参阅RFC1341 sec7.2多部分内容类型

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.