使用cURL和PHP为相同的键和文件上载混合多个值

Bea*_*sen 11 php curl

我在PHP的cURL绑定中遇到了限制.似乎没有简单的方法为postfields发送相同的多个值.我遇到的大多数解决方法都涉及手工创建URL编码的帖子字段tag = foo&tag = bar&tag = baz),而不是使用CURLOPT_POSTFIELDS的关联数组版本.

这似乎是一个非常普遍的需要支持,所以我觉得我一定错过了什么.这真的是处理同一个键的多个值的唯一方法吗?

虽然这种解决方法可能被认为是可行的(如果不是真的很烦人),我的主要问题是我需要能够为同一个键执行多个值并且还支持文件上载.据我所知,文件上传或多或少需要使用CURLOPT_POSTFIELDS的关联arravy版本.所以我觉得我被卡住了.

我已经在cURL PHP邮件列表上更详细地发布了这个问题,希望有人对此有一些想法.

关于我可以在哪里寻找更多信息的建议或提示非常感谢!

Bea*_*sen 12

我最终编写了自己的函数来构建一个带有multipart/form-data的自定义CURLOPT_POSTFIELDS字符串.太痛苦了.

function curl_setopt_custom_postfields($ch, $postfields, $headers = null) {
    // $postfields is an assoc array.
    // Creates a boundary.
    // Reads each postfields, detects which are @files, and which values are arrays
    // and dumps them into a new array (not an assoc array) so each key can exist
    // multiple times.
    // Sets content-length, content-type and sets CURLOPT_POSTFIELDS with the
    // generated body.
}
Run Code Online (Sandbox Code Playgroud)

我能够像这样使用这种方法:

curl_setopt_custom_postfields($ch, array(
    'file' => '@/path/to/file',
    'tag' => array('a', 'b', 'c'),
));
Run Code Online (Sandbox Code Playgroud)

我不确定CURLOPT_HTTPHEADER堆栈,所以由于这个方法调用它,我确定该函数允许用户在需要时指定额外的头文件.

在这篇博客文章中提供了完整的代码.