基于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




