我想问一个关于multipart/form-data
。 在HTTP标头中,我发现Content-Type: multipart/form-data; boundary=???
Content-Type: multipart/form-data; boundary=???
。 html
是???
可由用户自由定义? 或者它是从HTML生成的? 我能够定义??? = abcdefg
??? = abcdefg
? chrome
是
???
可由用户自由定义? 浏览器
是。 服务器
或者它是由HTML提供的? app
不, HTML与此无关 。 参见下文。 curl
我能够定义
???
做为abcdefg
? post
是。 测试
若是要将如下数据发送到Web服务器: 编码
name = John age = 12
使用application/x-www-form-urlencoded
将是这样的: url
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。 字符集参数:
与其余一些参数值不一样,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--
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请求。