Html 多部分/表单数据中的边界是什么?

Html 多部分/表单数据中的边界是什么?,html,http,forms,Html,Http,Forms,我想问一个关于多部分/表单数据的问题。在HTTP头中,我发现内容类型:multipart/formdata;边界=??? ?是否由用户自由定义?或者它是从HTML生成的?我是否可以定义?=abcdefg ?是否由用户自由定义 对 或者它是由HTML提供的 没有。与此无关。阅读下面的内容 我是否可以将?定义为abcdefg 对 如果要将以下数据发送到web服务器: name = John age = 12 使用application/x-www-form-urlencoded如下: name=J

我想问一个关于
多部分/表单数据的问题。在HTTP头中,我发现
内容类型:multipart/formdata;边界=???

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

是否由用户自由定义

或者它是由HTML提供的

没有。与此无关。阅读下面的内容

我是否可以将
定义为
abcdefg

如果要将以下数据发送到web服务器:

name = John
age = 12
使用
application/x-www-form-urlencoded
如下:

name=John&age=12
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--
如您所见,服务器知道参数由一个符号和
&
分隔。如果参数值需要
&
,则必须对其进行编码

那么,当服务器使用
multipart/formdata
接收HTTP请求时,它如何知道参数值的开始和结束位置呢

使用边界,类似于

例如:

--XXX
Content-Disposition: form-data; name="name"

John
--XXX
Content-Disposition: form-data; name="age"

12
--XXX--
在这种情况下,边界值为
XXX
。您可以在
内容类型
标题中指定它,以便服务器知道如何分割它接收的数据

因此,您需要:

  • 使用发送到服务器的HTTP数据中不会出现的值

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


问题的确切答案是:是的,您可以为
边界
参数
使用任意值,前提是它的长度不超过70字节,并且只包含(可打印)字符

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

您可能还希望在
内容类型
标题中将
字符集
参数设置为
UTF-8
,除非您可以绝对确定有效负载数据中将只使用
US-ASCII
字符集

以下是本报告的一些相关摘录:

  • 4.1.2。字符集参数:

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

  • 5.1。多部分媒体类型

    如内容传输编码字段[RFC 2045]的定义中所述,对于类型为“多部分”的实体,不允许除“7位”、“8位”或“二进制”之外的编码。“多部分”边界分隔符和标题字段在任何情况下都始终表示为7bit US-ASCII(尽管标题字段可能根据RFC 2047编码非US ASCII标题文本),身体部位内的数据可以逐个部位进行编码,每个适当的身体部位都有内容传输编码字段

    多部分实体的内容类型字段需要一个参数“边界”。然后将边界分隔符行定义为完全由两个连字符(“-”,十进制值45)组成的行,后跟内容类型标题字段中的边界参数值、可选线性空白和终止的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--

多部分/表单数据包含分隔名称/值对的边界。边界的作用类似于提交表单时传递的每个名称/值对块的标记。边界将自动添加到请求标头的内容类型中

具有enctype=“multipart/form data”属性的表单将有一个请求头内容类型:multipart/form data;边界---WebKit193844043-h(浏览器生成的vaue)

传递的有效负载如下所示:

name=John&age=12
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--
在webservice方面,它以@Consumes(“多部分/表单数据”)形式使用

注意,当使用chrome postman测试您的Web服务时,您需要从下拉框中选中表单数据选项(单选按钮)和文件菜单以发送附件。将内容类型显式提供为多部分/表单数据会引发错误。因为边界丢失,因为它通过附加边界覆盖了PostMan对content类型的服务器的curl请求,该边界可以正常工作


请参见

您必须在边界的末尾添加一个额外的“-”,您可以在文档中阅读。边界结尾必须有两个额外的催眠“-”链接:很好的答案。边界只是分隔多部分有效负载的多个“部分”的“关键”。通常,像“&”这样的东西足以分隔变量,但您需要更独特的东西来分隔有效负载中的有效负载。我认为内容类型标题中声明的边界值实际上将是-XXX---,因为在分隔部分时应该写入一个额外的“-”(因此--XXX---)如果在边界中不包含任何破折号,则会更清楚,因为这将清楚地显示由于协议而包含哪些破折号。我发现这就是答案。相关问答:边界是否与发布的任何数据一起上载到服务器,因此服务器自动使用指定的边界字符串而不是defa