5

次のコードを使用して、Telegram Bot 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います。正しい方法を使用していますか? getMeAPIを使用して取得することに問題はありません。

PS私はPHPの互換性のためにGuzzle 5.3.0を使用しています。

4

2 に答える 2

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 が正しいヘッダー タイプを設定していないと思われます。

于 2015-07-04T19:13:28.070 に答える
1

マルチパート投稿として試してみてください。

$client->post(
    'https://api.telegram.org/botMyApiKey/sendPhoto', 
    array(
        'multipart' => array(
            array(
                'name'     => 'chat_id',
                'contents' => '1111111'
            ),
            array(
                'name'     => 'photo',
                'contents' => $contents
            )
        )
    )
);

Guzzle のドキュメント リファレンス

ガズル5.3用

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);

注: ファイルの内容ではなく、ファイル ハンドルを 'photo' 属性に渡す必要があります。

于 2015-07-04T14:03:53.190 に答える