Отправка фотографии POST'ом

177
24 февраля 2018, 22:43

Здравствуйте, пишу бота для Вконтакте, проблема в заливке картинки на сервера вк для личных сообщений, заливаю так:

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, не должен быть пустым, т.к. его нужно использовать для - сохранения картинки на серверах.

Answer 1

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);
READ ALSO
Получение размера файла весом 40Гб

Получение размера файла весом 40Гб

Используя filesize() результат "-1424707584", как можно еще получить размер больших файлов?

236
Как вырезать текст php

Как вырезать текст php

Есть вот такой текст:

213
Не работает фуркция render() при Pjax-запросе

Не работает фуркция render() при Pjax-запросе

Доброго времени суток, у меня есть форма(ActiveForm), которую я пытаюсь передать через PjaxПроблема в том, что в контроллере не срабатывает функция...

201
Как вывести двумерный масив в php

Как вывести двумерный масив в php

Знаю как вывести одномерный масив:

212