Write Multiple files in a single CURL request

前端 未结 3 1369
無奈伤痛
無奈伤痛 2020-12-17 03:29

Is there a way using PHP curl to send multiple files in a single request?

I understand you can send a single file making use of the following:

$fh =          


        
相关标签:
3条回答
  • 2020-12-17 03:50

    You can use this

    $post = array(
         "file1"=>"@/path/to/myfile1.jpg",
         "file2"=>"@/path/to/myfile2.jpg",
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    
    0 讨论(0)
  • 2020-12-17 04:00

    A complete example would look something like this :

    <?php
    $xml = "some random data";
    $post = array(
         "uploadData"=>"@/Users/whowho/test.txt", 
         "randomData"=>$xml, 
    );
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, trim("http://someURL/someTHing"));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)");
    curl_exec($ch);
    echo curl_error($ch);
    curl_close($ch);
    
    
    ?>
    
    0 讨论(0)
  • 2020-12-17 04:04

    I searched a way to send a post request with multiple files using curl. But all code examples did not do the same as a browser does. The $_FILES global did not contain the usual array as documented by PHP.

    Now i found out why: the offsets where missing the [i]

    see http://php.net/manual/de/class.curlfile.php#121971

    Without the "trick" you would get a different result in $_FILES

    [
        'foo_bar' => [
            'name'     => 'path/to/my_file_1.png',
            'type'     => 'application/octet-stream',
            'tmp_name' => '/tmp/phpim24ij',
            'error'    => 0,
            'size'     => 123,
        ],
    ]
    

    or

    [
        'foo_bar_1' => [
            'name'     => 'path/to/my_file_1.png',
            'type'     => 'application/octet-stream',
            'tmp_name' => '/tmp/phpim24ij',
            'error'    => 0,
            'size'     => 123,
        ],
        'foo_bar_2' => [
            'name'     => 'path/to/my_file_1.png',
            'type'     => 'application/octet-stream',
            'tmp_name' => '/tmp/phpim24ij',
            'error'    => 0,
            'size'     => 123,
        ],
    ]
    

    But this is not what we want.

    What we want is the usual $_FILES array like

    [
        'foo_bar' => [
            'name'     => [
                0 => 'path/to/my_file_1.png',
                1 => 'path/to/my_file_2.png',
            ],
            'type'     => [
                0 => 'application/octet-stream',
                1 => 'application/octet-stream',
            ],
            'tmp_name' => [
                0 => '/tmp/phpSPAjHW',
                1 => '/tmp/php0fOmK4',
            ],
            'error'    => [
                0 => 0,
                1 => 0,
            ],
            'size'     => [
                0 => 123,
                1 => 234,
            ],
        ],
    ]
    

    Here the code:

    Example:

    $url = "http://api-foo.com/bar/baz";
    $uploadFormInputFieldName = 'foo_bar';
    $files = [
        'path/to/my_file_1.png',
        'path/to/my_file_2.png',
        // ...
    ];
    
    $postData = [];
    $i = 0;
    foreach ($files as $file) {
        if (function_exists('curl_file_create')) {
            $file = curl_file_create($file);
        } else {
            $file = '@' . realpath($file);
        }
        // here is the thing: post data needs to be $posData["foo_bar[0]"], $posData["foo_bar[1]"], ...
        $postData["{$uploadFormInputFieldName}[{$i}]"] = $file;
        $i++;
    }
    
    $httpClient = $this->getHttpClient($url); // get your client
    $httpClient->setHeader('Content-Type', 'multipart/form-data');
    $response = $httpClient->post($postData); // send post request
    
    0 讨论(0)
提交回复
热议问题