多部分/形式的边界是什么?

我想问一个关于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/*内容类型之一,实际上需要在Content-Type头中指定boundary参数,否则服务器(在HTTP请求的情况下)将无法分析有效内容。

    您可能还想在您的Content-Type标头中将charset参数设置为UTF-8 ,除非您可以绝对确保在有效内容数据中仅使用US-ASCII字符集。

    RFC2046的一些相关摘录如下:

  • 4.1.2。 字符集参数:

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

  • 5.1。 多部分媒体类型

    如Content-Transfer-Encoding字段[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--
    

    在web服务端,它在@Consumes(“multipart / form-data”)表单中被使用。

    请注意,当使用Chrome邮递员测试您的web服务时,您需要从下拉框中检查表单数据选项(单选按钮)和文件菜单以发送附件。 将content-type显式提供为multipart / form-data会引发错误。 因为边界缺失,因为它通过附加可以正常工作的边界来覆盖post-man对内容类型的curl请求。

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

    链接地址: http://www.djcxy.com/p/22207.html

    上一篇: What is the boundary in multipart/form

    下一篇: What are the ramifications of null bytes and multipart/form