当前位置:  开发笔记 > 前端 > 正文

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

如何解决《multipart/form-data的边界是什么?》经验,为你挑选了3个好方法。

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

???免费的用户定义?或者它通常来自HTML?我可以定义??? = abcdefg吗?



1> Oscar Medero..:

???免费的用户定义?

是.

或者它是由HTML提供的?

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

我可以定义???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数据中的值.

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


Yout必须在边界的末尾添加额外的" - ".
您可以在文档中阅读它.边界结束必须额外两次大肆宣传" - "链接:http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
很好的答案.边界只是分隔多部分有效载荷的多个"部分"的"关键".通常,类似'&'的东西足以分离变量,但您需要更独特的东西来分离有效负载内的有效负载.
我认为在Content-Type标题中声明的边界值实际上是-XXX ---因为在分离部分时应该写出额外的" - "(因此--- XXX ---)
@Chet随时编辑答案;)

2> antichris..:

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

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

您可能还希望在头中设置charset参数,除非您可以绝对确定在有效内容数据中仅使用字符集.UTF-8Content-TypeUS-ASCII

RFC2046的一些相关摘录:

4.1.2.字符集参数:

与其他一些参数值不同,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--



3> Yergalem..:

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

请参阅RFC1341 sec7.2 Multipart Content-Type

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有