Проблема с добавлением изображения к товару через Shop-Script 5 API

Мне нужно залить более 100 000 изображений к товарам. Импорт csv отработал пару раз по 500 картинок и сломался.
Пытаюсь организовать через Shop-Script 5 API.
Руководствуюсь инструкцией:
http://www.webasyst.ru/developers/docs/api/explorer/shop/shop.product.images.add/

Всякий раз получаю "error":"server_error","error_description":"No file uploaded."

Возможно я плохо понимаю, что добавлять к параметру "file":
Пробовал добавить абсолютный URL файла.
Пробовал загрузить файл на сервер в папку wa-data/public/ и добавлял в запросе относительный путь к файлу (например wa-data/public/123.jpg).
Пробовал добавить file_get_contents('http://somesite.ru/123.jpg')
Пробовал перед отправкой кодировать через base64_encode.

Все та же ошибка. Что делать?

Код примерно такой:
$url = 'http://myshop.ru/api.php/shop.product.add?product_id=100&access_token=...';
$post = 'file='.base64_encode(file_get_contents('http://site.ru/kartinka.jpg'));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

$output = curl_exec($ch);
curl_close($ch);
var_dump($output);

3 ответа

  • 1
    Вячеслав Ташкинов 17 февраля 2014 23:02 #
    Нашел рабочий вариант. Для добавления изображения требуется массив post:
    curl_setopt($ch, CURLOPT_POSTFIELDS,
    array('file' =>'@'.realpath($file_path))
    );
    • +1
      Евгений Е. Евгений Е. 14 сентября 2016 15:25 #

      в php7 и php < 5.5 разные способы формирования массивов для

      CURLOPT_POSTFIELDS

      пример такой функции:

      function post_files($url,$file, $name='') {
          //Post 1-n files, each element of $files array assumed to be absolute
          // path to a file.  $files can be array (multiple) or string (one file).
          // Data will be posted in a series of POST vars named $file0, $file1...
          // $fileN
      	if(empty($url) || empty($file))
      		return NULL;
      	//$data=array('file[]' => '@/'.realpath($file), 'name' =>'file' /*, 'description'=>$name*/);  php <5.5
      	$data=array('file' =>new \CURLFile($file), 'name' =>'file' /*, 'description'=>$name*/); //php >5.5, 7
          $ch = curl_init();
          curl_setopt($ch, CURLOPT_URL, $url);
          curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
          //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
          curl_setopt($ch, CURLOPT_POST, 1);
          curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
          $response = curl_exec($ch);
      	curl_close($ch);
          return $response;
      }

      где url - ссылка на api со всеми параметрами

      $url = 'http://myshop.ru/api.php/shop.product.add?product_id=100&access_token=...';

  • 1
    Salavat Dyusengaliev 16 июля 2014 16:04 #
    Добрый день! А нет ли рабочего примера для других платформ? Например, .NET (C#)?

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите