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

时间:2010-08-18 01:35:47

标签: html http forms

我想问一个关于multipart/form-data的问题。在HTTP标头中,我发现Content-Type: multipart/form-data; boundary=???

用户是否可以自由定义????或者它是从HTML生成的?我可以定义??? = abcdefg吗?

4 个答案:

答案 0 :(得分:354)

  

用户是否可以自由定义???

  

还是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数据中的值。

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

答案 1 :(得分:82)

问题的确切答案是:是的,您可以对boundary参数使用任意值,因为它的长度不超过70个字节且仅包含{{ 3}}(可打印)字符。

如果您使用multipart/*种内容类型之一,则实际上必需指定boundary标头中的Content-Type参数,否则指定服务器(在HTTP请求的情况下)将无法解析有效负载。

您可能还想在charset标题中将UTF-8参数设置为Content-Type,除非您绝对确保只有US-ASCII } charset将用于有效载荷数据。

7-bit US-ASCII的一些相关摘录:

  • 4.1.2。 Charset参数:

      

    与其他一些参数值不同,charset参数的值不区分大小写。默认字符集(在没有charset参数的情况下必须假设)是US-ASCII。

  • 5.1。多部分媒体类型

      

    如Content-Transfer-Encoding字段[RFC 2045]的定义中所述,对于“multipart”类型的实体,不允许除“7bit”,“8bit”或“binary”之外的编码。在任何情况下,“多部分”边界分隔符和标题字段始终表示为7位US-ASCII(尽管标题字段可以根据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--

答案 2 :(得分:17)

multipart / form-data包含 boundary 以分隔名称/值对。边界的作用类似于提交表单时传递的每个名称/值对的标记。边界自动添加到请求标头的内容类型。

带有 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服务时,您需要从下拉框中检查表单数据选项(单选按钮)和文件菜单以发送附件。将content-type显式提供为multipart / form-data会引发错误。因为边界丢失了,因为它通过附加工作正常的边界来覆盖post man到服务器的内容类型的curl请求。

请参阅RFC1341 sec7.2 The Multipart Content-Type

答案 3 :(得分:0)

我们必须拆分我们的数据。因此,服务器理解我们发送的内容。

1 示例:我们拆分数据

$email = $_POST['email'];
$p_id = $_POST['pid'];

2.示例:如果我们发送 JSON 数据 (With) 内容类型 Multipart/form-data,我们会收到与边界相关的警告

 $json = file_get_contents("php://input");