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

是??由用户自由定义?还是从HTML中生成的?我能不能定义一下??=英语字母?


是??由用户自由定义?

Yes.

还是HTML提供的?

不。HTML与此无关。阅读下面。

我能不能定义一下??英语字母吗?

Yes.

如果需要向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数据中的值。 保持一致,在请求消息中处处使用相同的值。


Multipart /form-data包含分隔名称/值对的边界。边界就像提交表单时传递的每个名称/值对块的标记。边界会自动添加到请求头的内容类型中。

具有enctype="multipart/form-data"属性的表单将有一个请求头Content-Type: multipart/form-data;边界——WebKit193844043-h(浏览器生成的值)。

传递的有效负载看起来像这样:

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端,它以@ consumers ("multipart/form-data")的形式被使用。

注意,当使用chrome postman测试你的webservice时,你需要从下拉框中检查表单数据选项(单选按钮)和文件菜单来发送附件。将content-type显式提供为multipart/form-data会抛出错误。因为边界是丢失的,因为它通过附加边界来覆盖post man对服务器的curl请求。

参见RFC1341章节7.2 Multipart Content-Type


我们必须分割数据。所以,服务器知道我们发送了什么。

1示例:我们拆分数据

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

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

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

使用这个

headers: {
    'content-type': 'application/x-www-form-urlencoded'
  }

对于边界误差