отправить фото для загрузки Фото не работает

Пытаюсь собрать телеграм-бота, но проблема связана с изменением функций php из-за более новой версии php 5.6.

Ниже приведен базовый код, который я нашел, с учетом изменений в php 5.6.

      #$filePhoto = curl_file_create($filepath, 'image/jpg', 'heInternet');  //**LINE 39**
      $filePhoto = new CURLFile($filepath, 'image/jpg', 'heInternet');  //**LINE 40**
      //$texto = $_POST['msg'];
      $content = array(
          'chat_id' => "@BugTheInternet",
          'photo' => $filePhoto
      );

      //curl required to post
      $ch = curl_init();

      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); // required as of PHP 5.6.0
      curl_setopt($ch, CURLOPT_POSTFIELDS, $filePhoto);  //**LINE 53**
      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  //fix http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/

      // receive server response ...
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

      $server_output = curl_exec ($ch);

Вот ошибка, которую я получаю:

Устарело: curl_setopt(): использование API @filename для загрузки файлов устарело. Вместо этого используйте класс CURLFile в C:\xampp где-то\somefile.php в строке 53.

Когда я меняю $content на $filePhoto в строке 53. Он запускается, и сервер Telegram отправляет сообщения в формате JSON. Ответ сервера:

"{"ok":false,"error_code":400,"description":"Error: Bad Request: there is no photo in request"}"

Я искал в Интернете часами, находя решения. Кстати, два способа, предложенные для PHP 5.6, которые я использую, находятся в строке 39, 40.

Пожалуйста, помогите мне, если вы сталкивались с этим или с чем-то другим. благодарю вас.


person Rahul Bali    schedule 05.11.2015    source источник
comment
что это с изображениями кода в последнее время??   -  person Funk Forty Niner    schedule 05.11.2015
comment
Мне его удалить.?   -  person Rahul Bali    schedule 05.11.2015
comment
вы должны включить свой код в текстовом формате, если посетители вопроса должны что-то исправить, а не перепечатывать все заново.   -  person Funk Forty Niner    schedule 05.11.2015
comment
TBH, я не очень много знаю о CURL, но я знаю о загрузке файлов в PHP. Что я знаю, так это то, что для обработки файлов требуется действительный enctype. Делает ли CURL это автоматически, я не могу сказать, но, когда я просмотрел некоторую документацию, похоже, что это так. Взгляните на эти вопросы и ответы в стеке stackoverflow.com/questions/4223977/ посмотрите, поможет ли это.   -  person Funk Forty Niner    schedule 05.11.2015
comment
Это хорошо. Но мой вопрос здесь немного отличается от этого.   -  person Rahul Bali    schedule 05.11.2015
comment
Ах хорошо. Что ж, посмотрим, ответит ли кто-нибудь еще на ваш вопрос.   -  person Funk Forty Niner    schedule 05.11.2015
comment
На самом деле, я нашел вашу ошибку: вы передаете $filePhoto в CURLOPT_POSTFIELDS, но вместо этого вы должны передать $content.   -  person retif    schedule 10.11.2015
comment
Да, и я использовал $content для CURLOPT_POSTFIELDS, это показывает ошибку 400. Как я сказал в вопросе, о второй ошибке.   -  person Rahul Bali    schedule 10.11.2015


Ответы (3)


Вы пробовали отправить это жестко вот так?

$ch = curl_init("https://api.telegram.org/bot<token>/sendPhoto&chat_id=<chatID>&photo=<path/to/your/image>");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_exec($ch);
curl_close ($ch);

Во-первых, я использовал POSTFIELDS и другие правильные вещи для cURL при отправке сообщения, но у меня это не сработало. Так что я жестко запрограммировал это, как в примере выше, и это просто сработало.

person retif    schedule 10.11.2015

ты должен удалить

'chat_id' => "@BugTheInternet",

из $content и добавьте chat_id в URL-адрес curl, потому что

Библиотека PHP cURL умирает, возвращая сообщение об ошибке «не удалось создать данные формы» при попытке использовать массив, содержащий значение, начинающееся с «@». Если массив изменен на строку в формате URL, закодированном как формат, проблема не возникает. ссылка: https://bugs.php.net/bug.php?id=50060

person ebrahim farshchi    schedule 29.01.2016
comment
И как ты предлагаешь мне это сделать? Создав переменную массива? - person Rahul Bali; 31.01.2016

Потратив на это целый час спустя годы после этого поста, я делюсь тем, как у меня это работает:

  function json($url, array $fields) {
    $ch = curl_init($url);
    $ok = 1;
    $ok &= curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
    $ok &= curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $ok &= curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    $ok &= curl_setopt($ch, CURLOPT_TIMEOUT, 120);
    $ok &= curl_setopt($ch, CURLOPT_HTTPHEADER, [
      "Accept: application/json"
    ]);
    $ok &= curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $ok &= curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    $ok &= curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
    if ($ok !== 1) {
      user_error("curl_setopt failed");
    }

    $res = curl_exec($ch);
    if ($res === false) {
      var_dump($res);
      user_error(curl_error($ch));
    }
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($res === false) {
      user_error('curl_exec fail');
    }

    $json = json_decode($res, true);
    if (! is_array($json)) {
      print_r($res);
      user_error("http_json::failed decoding");
    }
    return $json;
}

$f = new \CurlFile("/path/to/file.jpg", 'image/jpeg', 'filename.jpg');

$args = [
  "photo" => $f,
  "chat_id" => $group,
  "caption" => "Hello world"
];
$url = "https://api.telegram.org/bot$token/sendPhoto";
var_dump( json($url, $args) );

Это на PHP7, трюк, кажется, состоит в двух вещах:

  • Content-Type: multipart/form-data
  • Использование \CurlFile
person Mark    schedule 04.01.2020