8

I'm trying to upload more than one image with PHP Curl. The API I'm using gives me the following example:

curl -v -s -u username:password \
 -H "Content-Type: multipart/form-data" \
 -H "Accept: application/vnd.com.example.api+json" \
 -F "[email protected];type=image/jpeg" \
 -F "[email protected];type=image/jpeg" \
 -XPUT 'https://example.com/api/sellers/12/ads/217221/images'

So in my php script I tried this:

$files = array();

foreach($photos as $photo) {
    $cfile = new CURLFile('../' . $photo, 'image/jpeg', 'test_name');
    $files[] = $cfile;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://services.example.com/seller-api/sellers/' . $seller . '/ads/' . $voertuig_id . '/images');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
curl_setopt($ch, CURLOPT_PROXY,'api.test.sandbox.example.com:8080');
curl_setopt($ch, CURLOPT_USERPWD, 'USER:PASS');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Host: services.example.com',
    'Content-type: multipart/form-data; boundary=vjrLefDejJaWiU0JzZfsadfasd1rMcE2HQ-n7XsSx',
    'Accept: application/vnd.com.example.api+json'
));

$output = curl_exec($ch);

curl_close($ch);

First I got this response from the API:

 {
   "errors":{
      "error":{
         "@key":"unsupported-form-element"
      }
   }
}

but now there is no response at all. How do I use curl to upload multiple files?

if $files is an empty JSON for example, it gives no error at all and returns the images (empty ofcourse).

This is the documentation of the API I'm using: https://services.mobile.de/manual/new-seller-api.html#_upload_images

EDIT: I tried to build the request body and send it, but it doesn't do anything:

$requestBody = '';
$requestBody .= '--vjrLeiXjJaWiU0JzZkUPO1rMcE2HQ-n7XsSx\r\n';
$requestBody .= 'Content-Disposition: form-data; name="image"; filename="ferrari.JPG"\r\n';
$requestBody .= 'Content-Type: image/jpeg\r\n';
$requestBody .= 'Content-Transfer-Encoding: binary\r\n';

curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);

1 Answer 1

3

try use assoc array, how it use into documentation CURLFile

$photos = [
    'img1' => 'img1.jpg',
    'img2' => 'img2.jpg'
]

$files = [];

foreach($photos as $key => $photo) {
    $cfile = new CURLFile('../' . $photo, 'image/jpeg', $key);
    $files[$key] = $cfile;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://services.example.com/seller-api/sellers/' . $seller . '/ads/' . $voertuig_id . '/images');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
curl_setopt($ch, CURLOPT_PROXY,'api.test.sandbox.example.com:8080');
curl_setopt($ch, CURLOPT_USERPWD, 'USER:PASS');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Host: services.example.com',
    'Content-type: multipart/form-data; boundary=vjrLefDejJaWiU0JzZfsadfasd1rMcE2HQ-n7XsSx',
    'Accept: application/vnd.com.example.api+json'
));

$output = curl_exec($ch);

curl_close($ch);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.