小编Mel*_*vin的帖子

如何使用PHP和CURL上传多维POSTFIELDS的文件(multipart/form-data)?

我在使用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表单则不会有问题. …

php post curl file-upload multidimensional-array

6
推荐指数
1
解决办法
4330
查看次数

标签 统计

curl ×1

file-upload ×1

multidimensional-array ×1

php ×1

post ×1