Upload Multiple Files to Php Server Using Curl Command Line

I need to upload multiple files to a server using the curl command line utility. for a single file I have no problem using:

curl -F "image=@file1.gif"   

how would I do this with more than one file so that the php variable $_FILES["image"]["error"] would return an array?

I've tried

curl -F "image=@file1.gif" -F "image=@file2.gif"  
curl -F "image=@file1.gif,image=@file2.gif"  

but these are a stab in the dark.

2 Answers

The trick is to name the file uploading parameters unique.

curl -F "image=@file1.gif" -F "image2=@file2.gif"  

This will show up in the $_FILES superglobal as $_FILES['image'] and $_FILES['image2'].

To make the files grouped under one $_FILES index you need to name the parameters as arrays:

curl -F "image[]=@file1.gif" -F "image[]=@file2.gif"  
3

You can use curl_multi_init(). I was working on a project, and since I'm a newbie, not even a year probably, it was terrible hard for me. I needed to upload to a server using an api (anonfiles.com)

NOTE: My script is based on multiple files input from users. The code is as follows.

<?php
if (isset($_POST['btnUpload'])){
    $total = count($_FILES['file']['name']);
    for( $i=0 ; $i < $total ; $i++ ) {
      $filename = $_FILES['file']['name'][$i];
      $filedata = $_FILES['file']['tmp_name'][$i];
      $filetype = $_FILES['file']['type'][$i];
      $chfile = new CURLFile($filedata, $filetype, $filename); //creating a CURL object
      $request[]=['file'=>$chfile]; //making an asscoiative array with [1]=>['file'=>'curlobject'] and so on
      $urls[] = "";//added this each time because this was the only one url
    }

    print_r($request);//just for verification
    echo "<br>";
    print_r($urls);//verification
    echo "<br>";
    echo "<br>";
    $mh = curl_multi_init(); //initialise multi curl
    foreach ($urls as $key => $url) {
        $chs[$key] = curl_init($url);
        //set your own opts, these are the minimum required
        curl_setopt($chs[$key], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($chs[$key], CURLOPT_POST, true);
        curl_setopt($chs[$key], CURLOPT_POSTFIELDS, $request[$key]);//adding file data
        curl_setopt($chs[$key], CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));//make sure this header is there for it to act like data


        curl_multi_add_handle($mh, $chs[$key]);//add them to the handle that we initialised
    }

    //running the requests
    $running = null;
    do {
      curl_multi_exec($mh, $running);
    } while ($running);

    //getting the responses
    $responsearray = array();//Just to store the responses
    foreach(array_keys($chs) as $key){
        $error = curl_error($chs[$key]);
        $last_effective_URL = curl_getinfo($chs[$key], CURLINFO_EFFECTIVE_URL); 
        $time = curl_getinfo($chs[$key], CURLINFO_TOTAL_TIME);//response time
        $response = curl_multi_getcontent($chs[$key]);  // get results
        array_push($responsearray, $response);
        curl_multi_remove_handle($mh, $chs[$key]);//removing it as a handle
    }
    // close current handler
    curl_multi_close($mh);
    echo "<br>";
    echo "<br>";
    echo "<br>";
    echo "<br>";
    print_r($responsearray);
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Sarah Jenkins

Sarah Jenkins

Senior Technology Editor & AI Specialist

Sarah Jenkins is a veteran tech journalist with over 12 years of experience covering artificial intelligence, mobile innovations, and digital ethics. Her insights have appeared in leading technology publications worldwide.

Share this article
Twitter Facebook Pinterest