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

