You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于Telegram Bot API的PHP机器人:如何发送400MB以上大文件?

发送400MB+大文件到Telegram用户(PHP实现)

Hey there! 针对你用PHP开发Telegram Bot、要发送400MB以上大文件的需求,普通的sendDocument接口肯定不行——它最多支持50MB的文件。你得用Telegram Bot API提供的**分块上传(Upload by Parts)**功能,这是官方支持的、能处理最大2GB文件的方案。

下面我给你拆解具体步骤和PHP代码示例:

核心原理

分块上传就是把大文件拆成多个小片段(每个片段建议5MB,Telegram要求单块最小1024字节、最大5MB),依次上传到Telegram服务器,最后用上传完成后得到的file_id来发送给用户。

具体实现步骤

1. 准备基础参数

  • 你的Bot Token:比如123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
  • 目标用户ID(或聊天ID):比如123456789
  • 要发送的大文件路径:比如/path/to/your/large_file.zip
  • 分块大小:设为5*1024*1024(5MB,Telegram允许的最大值)

2. 计算分块信息

先获取文件总大小,然后计算需要分成多少块:

$filePath = '/path/to/your/large_file.zip';
$chunkSize = 5 * 1024 * 1024; // 5MB
$fileSize = filesize($filePath);
$totalParts = ceil($fileSize / $chunkSize);

3. 循环上传分块

uploadFile接口逐块上传,第一次上传不需要file_id,之后每次上传都要带上上一次返回的file_id

$botToken = 'YOUR_BOT_TOKEN';
$uploadUrl = "https://api.telegram.org/bot{$botToken}/uploadFile";

$fileHandle = fopen($filePath, 'rb');
$currentFileId = null;

for ($part = 0; $part < $totalParts; $part++) {
    // 读取当前分块
    $chunkData = fread($fileHandle, $chunkSize);
    if ($chunkData === false) {
        die("Failed to read chunk {$part}");
    }

    // 准备POST数据
    $postData = [
        'part_number' => $part,
        'total_parts' => $totalParts,
    ];
    if ($currentFileId) {
        $postData['file_id'] = $currentFileId;
    }

    // 用curl发送请求,注意要把分块数据作为file参数上传
    $ch = curl_init($uploadUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, [
        ...$postData,
        'file' => new CURLStringFile($chunkData, 'large_file.part', 'application/octet-stream')
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    // 解析响应,更新currentFileId
    $responseData = json_decode($response, true);
    if (!$responseData['ok']) {
        die("Upload chunk {$part} failed: " . $responseData['description']);
    }
    $currentFileId = $responseData['result']['file_id'];
}

fclose($fileHandle);

注意:PHP 7.4+支持CURLStringFile,如果是更低版本,可能需要用curl_file_create或者临时文件的方式来处理分块数据。

4. 用上传后的file_id发送文件

所有分块上传完成后,调用sendDocument接口,把currentFileId作为document参数:

$sendUrl = "https://api.telegram.org/bot{$botToken}/sendDocument";
$postData = [
    'chat_id' => 'TARGET_CHAT_ID',
    'document' => $currentFileId,
    'caption' => '这是你要的大文件!' // 可选,文件描述
];

$ch = curl_init($sendUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$responseData = json_decode($response, true);
if ($responseData['ok']) {
    echo "大文件发送成功!";
} else {
    echo "发送失败:" . $responseData['description'];
}

关键注意事项

  • 服务器资源:确保你的服务器有足够的内存和带宽来处理分块上传,避免因为内存不足导致脚本崩溃。
  • 重试机制:网络波动可能导致分块上传失败,建议给上传步骤加上重试逻辑(比如失败后重试3次)。
  • 文件类型:Telegram支持的文件类型可以参考官方文档,确保你的大文件类型在允许范围内。
  • 超时设置:curl请求可以设置更长的超时时间,比如CURLOPT_TIMEOUT => 60,避免大分块上传超时。

内容的提问来源于stack exchange,提问作者user9473317

火山引擎 最新活动