Страница 1 из 1

curl_file_create не работает

Добавлено: 01 окт 2021, 12:20
ipupkevich
Здравствуйте.

Столкнулся с непреодолимой проблемой. Вчера установил сервер, нужен был по сути только PHP, при установке выбрал только дефолтные модули (PHP 7.1 штатный).

Всё работает кроме curl_file_create. Есть скрипт, который через cURL обращается к внешнему ресурсу, отправляя ему в том числе POST-ом файл. На *nix-серваке (VPS обычный) этот же скрипт работает штатно.

Тут же я уже все копья сломал, всё перепроверил. Передаваемый функции файл точно читается, через file_get_contents его содержимое успешно читается.

Пробовал шаманить с путями до файла уже и вдоль, и поперёк, понимая, что собака порылась скорее всего именно там, так как виндовые пути нетипичные для *nix-based нативного софта. Менял уже слеши на обратные, пробовал и полные пути (C:\OpenServer\domains\localhost\...) и относительные пути - не аттачится файл и всё тут.

P.S. Галка запрета доступа к внешним ресурсам в настройках НЕ стоит, проверил уже.

Что делать?

Re: curl_file_create не работает

Добавлено: 01 окт 2021, 12:33
ipupkevich
Так, проблема всё-таки обнаружила себя в другом, ещё более банальном... увидел, включив verbose логирование ошибок курла.

cUrl error (#60): SSL certificate problem: certificate has expired

Re: curl_file_create не работает

Добавлено: 01 окт 2021, 12:44
ipupkevich
Всё, проблема решилась :)

Скачал свежий серт по ссылке https://curl.haxx.se/ca/cacert.pem и заменил оригинальный на свежий (C:\OpenServer\userdata\config\cacert.pem).

Re: curl_file_create не работает

Добавлено: 25 окт 2022, 09:12
igramnet
OSPanel-5.4.3
Обновил до последней версии файл cacert.pem, но не работает. Что ещё может быть?

Re: curl_file_create не работает

Добавлено: 25 окт 2022, 12:16
ipupkevich
igramnet писал(а): 25 окт 2022, 09:12 OSPanel-5.4.3
Обновил до последней версии файл cacert.pem, но не работает. Что ещё может быть?
Я в итоге решил все свои проблемы, начав использовать Guzzle.

https://docs.guzzlephp.org/en/stable/re ... tions.html

По сути это просто обёртка для штатного курла, но на удивление она работает отлично и без багов. Стоит освоить методы и дальше работа с ним будет одно удовольствие. Рекомендую.

Re: curl_file_create не работает

Добавлено: 18 апр 2023, 09:31
mazai
Столкнулся еще с одной ошибкой curl_file_create или передачей его результатов через Curl.

Для отправки Телеграм боту файла размещенного на https (не локального), готовим массив:

$file = 'https://api.telegram.org/file/bot_TOKEN ... file_3.jpg'; // ниже описано различие
или
$file = 'https://site.dot/myimg.jpg'; // ниже описано различие

$arrayQuery = array(
'chat_id' => $tg_uid,
'caption' => 'Get file from original source… Please wait… ',
'photo' => curl_file_create($file)
);

и передаем

$ch = curl_init(https://api.telegram.org/bot_TOKEN_/sendPhoto);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

var_dump(json_decode($res, true));

Формально, все работает, но на части серверов Телеграм принимает и обрабатывает данные, а на части выдает ошибку {"ok":false,"error_code":400,"description":"Bad Request: there is no photo in the request"}, на других вообще не выдает ответ.

Опытным путем удалось установить, ошибка возникает на PHP Version ниже 7.4.33
На PHP Version 7.2.34 — Телеграм не отвечает
На PHP Version 7.3.31 — Телеграм дает ошибку «Bad Request: there is no photo in the request»
На 7.4 и 8+ все работает, получаем ответ типа «{"ok":true,"result":{"message_id":480,"from":{"id":…»

Причем, поведение может немного меняться от того какой файл предается, я экспериментировал с двумя типами: JPEG и файл сохраненный в API Телеграм (доступен по динамической (генерируемой) ссылке типа https://api.telegram.org/file/bot_TOKEN ... file_3.jpg у него mime-type определяется как application/octet-stream

На PHP Version dsit 7.4.33+ все работает в любом случае, на версиях ниже описания ошибок могут различаться, если изменить массив таким образом:
'photo' => curl_file_create($file)
а
'photo' => $file
В таком варианте, файл с mime-type может передаваться в некоторых версиях. У меня стояла задача отправлять файл из Tg в Tg и соответственно, это не решало моей проблемы.