С обновлением пхп на сервере (с 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; }
вот и все 🙂