vk.com wall.post не загружает фото


С обновлением пхп на сервере (с 5.2 до 5.6) перестал работать скрипт отправки фото на стену группы вконтакте. При разборе полетов нашлась вот такая ошибка:

One of the parameters specified was missing or invalid: photos_list is invalid

выявилось, что серверу вк не правильно передавалась информация о файле и в итоге после попытки загрузки фото на сервер возвращался пустой массив [photo].

Решение нашлось вот тут и оказалось простым. Изначально функция выглядела вот так:

        public function createPhotoAttachment($file)
        {
            $result = $this->callMethod('photos.getWallUploadServer', array(
                'gid' => $this->groupId
            ));
     
            $ch = curl_init($result->response->upload_url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, array(
                'photo' => '@' . getcwd() . '/' . $file
            ));
			//var_dump($result);
            if (($upload = curl_exec($ch)) === false) {
                throw new Exception(curl_error($ch));
            }
     
            curl_close($ch);
            $upload = json_decode($upload);
            $result = $this->callMethod('photos.saveWallPhoto', array(
                'server' => $upload->server,
                'photo' => $upload->photo,
                'hash' => $upload->hash,
                'gid' => $this->groupId,
            ));
     
            return $result->response[0]->id;
        }

а решение оказалось простым:

ПОЛЕЗНО  Вытягиваем картинку видео из вконтакта

Часа четыре убил на пляски с бубном пытаясь побороть пустой массив photo.
У кого php > 5.5.0 вот рабочий код

<?php

$url = $_POST['upload_url'];

$file = new CURLFile(realpath('photo.jpg'));

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'photo' => $file
));
$data = curl_exec($ch);
curl_close($ch);

echo $data;

итого функция изменилась вот так и фото опять начали загружаться 🙂

        public function createPhotoAttachment($file)
        {
            $result = $this->callMethod('photos.getWallUploadServer', array(
                'gid' => $this->groupId
            ));
			
	$file = new CURLFile(realpath($file));
     
            $ch = curl_init($result->response->upload_url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, array(
		'photo' => $file
            ));
			//var_dump($result);
            if (($upload = curl_exec($ch)) === false) {
                throw new Exception(curl_error($ch));
            }
     
            curl_close($ch);
            $upload = json_decode($upload);
            $result = $this->callMethod('photos.saveWallPhoto', array(
                'server' => $upload->server,
                'photo' => $upload->photo,
                'hash' => $upload->hash,
                'gid' => $this->groupId,
            ));
     
            return $result->response[0]->id;
        }

вот и все 🙂