我在使用 PHP 和 CURL 发布带有文件上传的多维数组时遇到问题。
多维数组例如:
$post['question'] = 'Are you human?';
$post['answers'] = array('yes', 'no', 'maybe');
$post['file'] = '@/path/to/file';
// Output:
Array(
'question' => Are you human?,
'answers' => Array(
'0' => yes,
'1' => no,
'2' => maybe
),
'file' => @/path/to/file
)
如果您只是尝试使用 CURL 中的 CURLOPT_POSTFIELDS 来发布此内容,则有一些原因会导致此方法不起作用,如下所示:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
首先是官方的PHP描述CURLOPT_POSTFIELDS 说:
要在 HTTP“POST”中发布的完整数据
手术。要发布文件,请在前面添加
文件名带有@并使用完整路径。
这可以作为
urlencoded 字符串就像
'para1=val1¶2=val2&...' 或作为
以字段名称作为键的数组
字段数据作为值。如果值是一个
数组,Content-Type 标头将是
设置为多部分/表单数据。
听起来您可以将任何类型的数组传递给 POSTFIELDS,对吗?错误的。 POSTFIELDS 仅接受非标量值,并且会因Array to string conversion
传递多维数组时出错。所以,你唯一的选择就是http_build_query()
您的数组能够传递不会阻塞的多维数组。
但是..正如您可以在 PHP 页面上的注释中读到的那样:
注意:将数组传递给
CURLOPT_POSTFIELDS 将编码
数据为多部分/表单数据,而
传递 URL 编码的字符串将
将数据编码为
应用程序/x-www-form-urlencoded。
如果您将 urlencoded 字符串传递给 POSTFIELDS,则该帖子不会进行 multipart/form-data 编码,从而导致文件上传失败。
因此,将两者与 CURL 结合起来几乎是不可能的,但如果您使用常规 HTML 表单,则不会有问题。
我的问题是:是否有可能绕过 CURL 这个奇怪的怪癖来发布多维数组和文件上传?