Как загрузить файл VK API PHP 7?

Изначально тестировал программу на локальном сервере, где установлена 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);
  • Вопрос задан
  • 1404 просмотра
Решения вопроса 1
volfing
@volfing Автор вопроса
$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);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@springimport
Curl это слишном низко, т.е. низкоуровнево. Могу посоветовать переходить на Guzzle.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы