【问题标题】:Upload multiple files with curl使用 curl 上传多个文件
【发布时间】:2017-11-12 10:33:07
【问题描述】:

如何使用CURLFilecurl_setopt 在一个数组中上传多个文件?

使用数据数组会引发错误(无法将数组转换为字符串)并且数据上的http_build_query 会损坏CURLFile 对象。

我要上传的数据是这样的:

[
    'mode' => 'combine',
    'input' => 'upload',
    'format' => $outputformat,
    'files' => [
        [0] => CURLFile object,
        [1] => CURLFile object,
        [x] => ...
    ]
]

【问题讨论】:

    标签: php file curl upload


    【解决方案1】:

    PHP 5.5+ 具有无需使用 CURLFile 即可创建文件的功能:curl_file_create

    您可以像这样上传多个文件:

    <?php
    
    $files = [
        '/var/file/something.txt',
        '/home/another_file.txt',
    ];
    
    // Set postdata array
    $postData = ['somevar' => 'hello'];
    
    // Create array of files to post
    foreach ($files as $index => $file) {
        $postData['file[' . $index . ']'] = curl_file_create(
            realpath($file),
            mime_content_type($file),
            basename($file)
        );
    }
    
    $request = curl_init('https://localhost/upload');
    curl_setopt($request, CURLOPT_POST, true);
    curl_setopt($request, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($request);
    
    if ($result === false) {
        error_log(curl_error($request));
    }
    
    curl_close($request);
    

    这将作为file下的数组在服务器上接收,就像有一个已发布的表单一样,这是$_FILES

    Array
    (
        [file] => Array
            (
                [name] => Array
                    (
                        [0] => 1.txt
                        [1] => 2.txt
                    )
    
                [type] => Array
                    (
                        [0] => text/plain
                        [1] => text/plain
                    )
    
                [tmp_name] => Array
                    (
                        [0] => /private/var/folders/cq/7262ntt15mqdmylblg9p1wf80000gn/T/phpp8SsKD
                        [1] => /private/var/folders/cq/7262ntt15mqdmylblg9p1wf80000gn/T/php73ijEP
                    )
    
                [error] => Array
                    (
                        [0] => 0
                        [1] => 0
                    )
    
                [size] => Array
                    (
                        [0] => 6
                        [1] => 6
                    )
    
            )
    
    )
    

    这是$_POST

    Array
    (
        [somevar] => hello
    )
    

    【讨论】:

    • 问题是服务器是一个API,文件必须放在“files”数组中。
    • 他们是否希望文件是像您发布数据那样的文件数组或其他格式的文件数组,例如文件内容的 base64 编码字符串?
    • 文件或base64,但不鼓励大文件使用后一种选项。
    • 它不起作用。我的数组似乎格式正确 (files[0] =&gt; CURLFile Object, files[1] =&gt; CURLFile Object, ...) 但curl_exec 一直运行到超时...
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2015-05-14
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多