我正在尝试使用TelegramBot API使用以下代码上传图片
if(file_exists($_FILES['fileToUpload']['tmp_name'])){
$new = fopen($_FILES['fileToUpload']['tmp_name'], "rb");
$contents = fread($new, $_FILES['fileToUpload']['size']);
fclose($new);
$client = new Client();
$response = $client->post("https://api.telegram.org/botMyApiKey/sendPhoto", [
'body' => ['chat_id' => '11111111', 'photo' => $contents]
]);
var_dump($response);
}else{
echo("No File");
}
我正在 Nginx 502 Bad Gateway
。我使用的方法是否正确?我在使用API获取 getMe 方面没有任何问题。
P.S我使用Guzzle 5.3.0来兼容php。
答案 0 :(得分:1)
尝试将其作为多部分发布。
use GuzzleHttp\Client;
$client = new Client(['defaults' => [
'verify' => false
]]);
$response = $client->post('https://api.telegram.org/bot[token]/sendPhoto', [
'body' => [
'chat_id' => 'xxxxx',
'photo' => fopen(__DIR__ . '/test.jpg', 'r')
]
]);
var_dump($response);
Guzzle documentation reference
对于Guzzle 5.3
{{1}}
注意:您必须将文件句柄传递给'photo'属性,而不是文件的内容。
答案 1 :(得分:1)
我终于找到了解决方案。为别人贴上我的解决方案。
move_uploaded_file($_FILES['photo']['tmp_name'], __DIR__."/temp/".$_FILES['photo']['name']); //Important for Form Upload
$client = new Client();
$request = $client->createRequest('POST', 'https://api.telegram.org/botMyApiKey/sendPhoto');
$postBody = $request->getBody();
$postBody->setField('chat_id', '11111111');
$postBody->addFile(new PostFile('photo', fopen(__DIR__."/temp/".$_FILES['photo']['name'], "r") ));
try{
$response = $client->send($request);
var_dump($response);
}catch(\Exception $e){
echo('<br><strong>'.$e->getMessage().'</strong>');
}
我很困惑为什么这种方法适用于这种Guzzle方法,而不是另一种方法。我怀疑Guzzle没有使用第一种方法设置正确的标题类型。
答案 2 :(得分:0)
Guzzle中的POST请求随附一个 如果是POST字段,则为
application/x-www-form-urlencoded
Content-Type标头 存在,但POST中没有发送文件。如果文件是 在POST请求中指定,然后Content-Type标头将 变为multipart/form-data
。客户端对象的post()方法接受四个参数:URL, 可选标头,发布字段和一组请求选项。至 在POST请求中发送文件,将@符号添加到数组中 值(就像你使用PHP curl_setopt一样) 功能)。 例如:
$request = $client->post('http://httpbin.org/post', array(), array(
'custom_field' => 'my custom value',
'file_field' => '@/path/to/file.xml'
));
因此对于Telegram API,这将成为:
$request = $client->post('https://api.telegram.org/botMyApiKey/sendPhoto', array(), array(
'chat_id' => 'xxxx',
'photo' => '@/path/to/photo.jpg'
));