Здравствуйте, пишу бота для Вконтакте, проблема в заливке картинки на сервера вк для личных сообщений, заливаю так:
getPhoto('/1.jpg', $token);
function getPhoto($path, $token)
{
$res = json_decode(file_get_contents('https://api.vk.com/method/photos.getMessagesUploadServer?v=5.73&access_token='.$token),true)['response'];
echo $res['upload_url']."\n";
$post_data = array("file1" => dirname(__FILE__).$path);
print_r($res);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $res['upload_url']);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$result = json_decode(curl_exec($ch),true);
print_r($result);
}
После первого запроса на сервера вк, мы получаем
Array
(
[upload_url] => https://pu.vk.com/c841226/upload.php?act=do_add&mid=************&aid=-64&gid=**********&hash=31e0f998f1111bddbd6e958ed45a21fb&rhash=222628001029a7ec21ea6a1494491b82&swfupload=1&api=1&mailphoto=1
[album_id] => -64
[group_id] => ***************
)
Потом на upload_url я POST запросом отправляю картинку
Делаю вот так:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $res['upload_url']);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$result = json_decode(curl_exec($ch),true);
На выходе в переменой $result будет:
Array
(
[server] => 841226
[photo] => []
[hash] => 62cd72013627d732c2f61ecbcfde8dac
)
Но объект photo, не должен быть пустым, т.к. его нужно использовать для - сохранения картинки на серверах.
PHP < 5.5
До этой версии, для передачи файлов с помощью CURL необходимо доьавлять @ к пути файла (как это сделано в нативном cURL). Т.е. в вашему случае:
$post_data = array("file1" => '@' . dirname(__FILE__) . $path);
PHP >= 5.5
В версии 5.5 был введён класс CURLFile для загрузки файлов, а подход с добавлением @ был объявлен как Deprecated (и удалён в PHP 7.0).
Теперь загрузка файлов с помощью curl выглядит так:
$file1 = new CurlFile(dirname(__FILE__) . $path, 'image/jpg');
$post_data = array("file1" => $file1);
Подробнее здесь и здесь.
В версиях PHP 5.5 - 5.6 всё ещё можно использовать старый подход с @, но необходимо явно указывать параметр CURLOPT_SAFE_UPLOAD:
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости