如何使用multipart/form-data编码POST一个数组?

21
在GET参数字符串或"application/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个回答

25

如果您想要一个关联数组,可以将索引作为表单字段名称传递:

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] => '第一个索引', [1] => '第二个索引' ) )

在参数名称中带有 [] 的情况下,将其转换为数组是 PHP 特有的功能(http://www.php.net/manual/zh/faq.html.php#faq.html.arrays)。

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


1
谢谢Alexei。你有没有关于定义这个的规范或文档的参考资料?特别是关于多部分POST和标准urlencoded之间的区别? - DougW
1
我已经在答案中添加了几个链接。 - Alexei Tenitski
我在这里肯定是有点挑剔,但我想指出的是PHP文档只提到了这个约定与通过x-www-form-urlencoded始终POST的Web表单有关。 我猜测当POST变量从Apache传递给PHP时,没有内容类型之间的区别,但我实际上没有读到任何证实这一点的东西。 而且,关于PHP的许多看似安全的假设最终都被证明是灾难性的错误。 我会确保验证这一点。 - DougW
这对于使用 multer 的 node.js express 服务器同样适用。不过,name [foo] 将给您一个对象:{ foo: 'value' }。而 name [] 或 name [0] 将给您一个数组:[ 'value' ]。 - Aidan Do

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接