Im currently working with some kind of API. I have wrote simple functions which allows me to add new content, however Im stuck on uploading images.
Here\'s simple CURL c
After several approaches using curl_file_create without getting it to work. I think the mobile.de-API is just implemented badly.
I ended up implementing a custom routine for CURLOPT_POSTFIELDS that is creating the complete multipart manually. I borrowed most of the code from the PHP manpage as "The CURLFile class".
Create multipart header (see code below)
function curl_custom_postfields(array $files = array()) {
// build file parameters
foreach ($files as $k => $v) {
switch (true) {
case false === $v = realpath(filter_var($v)):
case !is_file($v):
case !is_readable($v):
continue; // or return false, throw new InvalidArgumentException
}
$data = file_get_contents($v);
$body[] = implode("\r\n", array(
"Content-Disposition: form-data; name=\"image\"",
"Content-Type: image/jpeg",
"",
$data,
));
}
// generate safe boundary
do {
$boundary = "---------------------" . md5(mt_rand() . microtime());
} while (preg_grep("/{$boundary}/", $body));
// add boundary for each parameters
array_walk($body, function (&$part) use ($boundary) {
$part = "--{$boundary}\r\n{$part}";
});
// add final boundary
$body[] = "--{$boundary}--";
$body[] = "";
// set options
return array(implode("\r\n", $body), $boundary);
}
Use that function ;)
$postfields = $this->curl_custom_postfields($files);
Add boundary to http header
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; boundary=' . $postfields[1], 'Accept: application/vnd.de.mobile.api+json'));
Add Postfields
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields[0]);
It's not the cleanest solution at all so please use it with care. But at least it works.
I have the same problem and found a solution but only for single images. The trick is that your array MUST look like these:
$images = array(
'image' => 'PATH/IMG.jpg',
);
That means that the the key must be "image" and nothing other! I hope that helps ;)