我遇到了使用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"操作中发布的完整数据。要发布文件,请使用@将文件名前缀并使用完整路径。这可以作为urlencode字符串传递,例如“para1=val1&para2=val2&...”,也可以作为具有字段名称为键和字段数据为值的数组传递。如果值是一个数组,则Content-Type标头将设置为multipart / form-data。
听起来您可以将任何类型的数组传递给POSTFIELDS?错了。POSTFIELDS仅接受非标量值,并且在传递多维数组时会出现“Array to string conversion”错误。因此,您唯一的选择是使用http_build_query()构建您的数组,以便能够传递不会噎住的多维数组。
但是,正如您可以在PHP页面上的注释中读到的那样:
注意:将数组传递给CURLOPT_POSTFIELDS将将数据编码为multipart / form-data,而将URL编码的字符串传递将将数据编码为application / x-www-form-urlencoded。
如果您向POSTFIELDS传递urlencode字符串,则无法将帖子编码为multipart / form-data,从而导致文件上传失败。
因此,似乎几乎不可能在CURL中将两者组合起来,而如果您使用常规HTML表单,则不会有问题。
我的问题是:是否可以绕过CURL的这种奇怪行为,以便能够发布多维数组和文件上传?