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

时间:2017-05-09 15:32:22

标签: php curl telegram-bot

我有一种向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);

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

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

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

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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

在php ver 5.5及以上版本中设置@/pathToFile并将new \CURLFile($pathToFile)更改为{{1}}。 根据php changeLog

  

现在仅在CURLOPT_SAFE_UPLOAD选项设置为FALSE时才支持使用@file语法进行上载。应该使用CURLFile。

将CURLOPT_SAFE_UPLOAD变为false不是最佳做法,也不推荐使用 阅读第一条评论here,了解有关CURLFile的更多信息。