如何发布具有多部分/表单数据编码的数组?

Posted

技术标签:

【中文标题】如何发布具有多部分/表单数据编码的数组?【英文标题】:How do I POST an array with multipart/form-data encoding? 【发布时间】:2012-04-17 16:06:35 【问题描述】:

在 GET 参数字符串或“x-www-form-urlencoded”POST 请求中,可以通过用括号命名参数来指定参数数组(例如“name[]”)。

是否有一种“正确”(或至少是一种广泛使用的约定)方式来使用“multipart/form-data”POST 请求指定参数数组?

以下是否正确?

Content-Type: multipart/form-data; boundary=--abc

--abc
Content-Disposition: form-data; name="name[]"

first index
--abc
Content-Disposition: form-data; name="name[]"

second index

如果它因平台而异,我对 Apache/php 的约定感兴趣。

【问题讨论】:

【参考方案1】:

如果你想要一个关联的数组,你可以在表单字段的名称中传递索引:

Content-Type: multipart/form-data; boundary=--abc

--abc
Content-Disposition: form-data; name="name[first]"

first value
--abc
Content-Disposition: form-data; name="name[second]"

second value

然后在 php 级别 print_r($_POST) 会给你

Array ( [name] => Array ( [first] => 'first value', [second] => 'second value' ) )

如果你只是一个普通的有序数组,那么和你做的一样:

Content-Type: multipart/form-data; boundary=--abc

--abc
Content-Disposition: form-data; name="name[]"

first index
--abc
Content-Disposition: form-data; name="name[]"

second index

然后在 php 级别 print_r($_POST) 会给你

Array ( [name] => Array ( [0] => 'first index', [1] => 'second index' ) )

名称中带有 [] 的参数在服务器端转换为数组是 PHP 特有的功能 (http://www.php.net/manual/en/faq.html.php#faq.html.arrays)。

关于多部分编码,您可以在 RFC 中找到更多信息:http://www.ietf.org/rfc/rfc1867.txt

【讨论】:

谢谢阿列克谢。您是否碰巧参考了定义此内容的任何规范或文档?特别是关于多部分 POST 与标准 urlencoded 的对比? 我添加了几个链接到答案 我在这里肯定是挑剔的,但我想指出的是,PHP 文档只提到了关于始终通过 x-www-form-urlencoded 发布的 Web 表单的这种约定。我猜测当 POST 变量从 Apache 移交给 PHP 时,内容类型之间没有区别,但我实际上还没有阅读任何可以证实这一点的内容。并且肯定有很多关于 PHP 的看似安全的假设结果是灾难性的错误。我会确保验证这一点。

以上是关于如何发布具有多部分/表单数据编码的数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用多部分/表单和分块编码在 spring mvc 中接收文件上传?

使用 AJAX + 多部分表单数据 + UTF-8 编码发送文件和文本

发布多部分表单数据问题

具有特定 JSON 要求的多部分表单数据 POST

多部分/表单数据的 POSTMAN

API Gateway - 发布多部分/表单数据