我在使用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
)
Run Code Online (Sandbox Code Playgroud)
如果您只是尝试使用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);
Run Code Online (Sandbox Code Playgroud)
首先,CURLOPT_POSTFIELDS 的官方PHP 描述说:
要在HTTP"POST"操作中发布的完整数据.要发布文件,请在文件前加上@并使用完整路径.这可以作为urlencoded字符串传递,如'para1 = val1¶2 = val2&...',或者作为一个数组,字段名称为键,字段数据为值.如果value是数组,则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.
如果将urlencoded字符串传递给POSTFIELDS,则该帖子将不会进行多部分/表单数据编码,从而导致文件上载失败.
因此,将两者与CURL结合起来似乎几乎是不可能的,如果您使用常规HTML表单则不会有问题. …