首页 文章

PHP CURL 多部分表单数据不上传文件(PHP Ver.5.6)

提问于
浏览
0

我有一个向 Telegram 发送请求的方法,这个函数在我的服务器上按预期正常运行。转移到 costumer 服务器后,我收到来自 Telegram 的错误:Bad Request: URL host is empty

通过 Curl 发送的数据是:

$data = array(
    "chat_id" => "user_id",
    "video"   => "@/path/to/file/tested/successfully",
    "caption" => "My Text"
);

为 curl 设置的选项如下:

curl_setopt($ch, CURLOPT_URL, 'URL/TO/TELEGRAM/API');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

此代码在我的服务器上正常工作,我认为必须在服务器上设置配置。

另一个应该关联的问题是:当我提供错误的文件路径时,在第一台服务器上我得到了预期的Error Code: 3, Couldn't open file来自 curl 但是在第二台服务器上我将再次得到Bad Request: URL host is empty

所以也许我可以说第二台服务器上的 curl 无法理解video索引是一个文件。

第一台服务器是专用的,但第二台是共享主机(2 台主机已测试)(发现 1)
第一个服务器 php 版本是 5.5.38,但第二个是 5.6(发现 2)
将第二个 php 版本更改为 5.5.38 后,它正常工作(发现 3)

任何帮助将不胜感激

1 回答

  • 1

    在 php ver 5.5 及以上设置curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true)并将@/pathToFile更改为new \CURLFile($pathToFile)。根据 php 更新日志

    现在只有在 CURLOPT_SAFE_UPLOAD 选项设置为 FALSE 时才支持使用 the_1_syntax 上传。应该使用 CURLFile 代替。

    将 CURLOPT_SAFE_UPLOAD 转为 false 不是最佳做法并且已弃用
    有关 CURLFile 的更多信息,请阅读第一条评论这里

相关问题