Изначально тестировал программу на локальном сервере, где установлена php версии 5.5. Чтобы загрузить файл я использовал следующую функцию:
public function savePhoto($aid, $gid, $file, $caption){//Загрузка фото в группу
$response = $this->get("photos.getUploadServer", array(
"album_id" => $aid,
"group_id" => $gid
));
$ch = curl_init();
$data = array('file' => '@' . $file);
curl_setopt($ch, CURLOPT_URL, $response->response->upload_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$res = curl_exec($ch);
$res = json_decode($res);
$resp = $this->get("photos.save", array(
"album_id" => $aid,
"group_id" => $gid,
"server" => $res->server,
"photos_list" => $res->photos_list,
"hash" => $res->hash,
"caption" => $caption
));
return $resp;
}
Я перенес программу на виртуальный сервер, там стоит php 7.0, данный способ там не работает, как я понял, это связано с тем, что в php выше 5.5 необходимо файлы передавать через curl объекты.Собственно, теперь я использую следующий код:
$response = $this->get("photos.getUploadServer", array(
"album_id" => $aid,
"group_id" => $gid
));
$ch = curl_init();
$curlfile = new CURLFile($file, 'image/jpeg', 'kvartira.jpg');
$data = array("file" => $curlfile);
curl_setopt($ch, CURLOPT_URL, $response->response->upload_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$res = curl_exec($ch);
echo curl_error($ch);
curl_close ($ch);
$res = json_decode($res);
$resp = $this->get("photos.save", array(
"album_id" => $aid,
"group_id" => $gid,
"server" => $res->server,
"photos_list" => $res->photos_list,
"hash" => $res->hash,
"caption" => $caption
));
И в ответ от API я всегда получаю сначала:
object(stdClass)#7 (5) {
["server"]=>
int(631619)
["photos_list"]=>
string(2) "[]"
["aid"]=>
int(215173582)
["hash"]=>
string(32) "3d6f2fbe2d056681143a1800ab054d97"
["gid"]=>
int(93036481)
}
Затем, при попытке сохранения фото:
["error_code"]=>
int(100)
["error_msg"]=>
string(78) "One of the parameters specified was missing or invalid: photos_list is invalid"
Оно и понятно, потому что "photos_list" пустой, файл не передается в запросе. Кто знает, как можно отправить файл запрос на URL из php скрипта ?
UPD:
После нескольких часов поисков - я нашел, все таки, ответ на свой вопрос. После версии php выше 5.5 нужно шаманить с "CURLOPT_SAFE_UPLOAD", чтобы можно было отдавать файлы прямо из скрипта. Собственно, вот рабочий код:
$aPost = array(
'file' => new CURLFile($file)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $response->response->upload_url);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec ($ch);
curl_close($ch);
$res = json_decode($res);