
本文详解使用 telegram longpollingbot(基于 java + spring boot)接收用户照片后,通过 telegram bot api 正确下载高清原图并持久化到本地文件系统的方法,避免常见误区(如误存 file_id 字符串),涵盖完整流程、代码示例与关键注意事项。
本文详解使用 telegram longpollingbot(基于 java + spring boot)接收用户照片后,通过 telegram bot api 正确下载高清原图并持久化到本地文件系统的方法,避免常见误区(如误存 file_id 字符串),涵盖完整流程、代码示例与关键注意事项。
在 Telegram Bot 开发中,用户发送的 PhotoSize 对象本身不包含图片二进制数据,仅提供元信息(如 file_id、宽高、缩略图尺寸等)。你无法直接从 photoSize.getFileId().getBytes() 获取图片——那只是字符串 ID 的字节,毫无图像意义。真正获取高清原图的唯一标准方式是:调用 Telegram Bot API 的 getFile 接口,再通过返回的 filePath 下载文件流。
以下是完整、可靠、高质量保存用户照片的实现步骤(适配 TelegramBots 6.x+ 版本,兼容 Spring Boot):
✅ 正确流程:获取 file_id → 查询文件路径 → 流式下载 → 本地保存
import org.telegram.telegrambots.client.okhttp.OkHttpTelegramClient;
import org.telegram.telegrambots.meta.api.methods.GetFile;
import org.telegram.telegrambots.meta.api.objects.File;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import java.io.*;
import java.net.URL;
// 假设你已注入或持有 bot 实例(如 TelegramLongPollingBot)
public void saveUserPhoto(PhotoSize photoSize, String saveDir) throws TelegramApiException, IOException {
String fileId = photoSize.getFileId(); // ✅ 获取真实 file_id(非字符串 ID 字节!)
// 1. 调用 getFile 获取远程文件路径
GetFile getFileRequest = GetFile.builder().fileId(fileId).build();
File telegramFile = bot.execute(getFileRequest); // 返回包含 filePath 的 File 对象
// 2. 构造 Telegram 文件下载 URL(注意:需替换为你的 bot token)
String botToken = "YOUR_BOT_TOKEN"; // 生产环境请从配置中心/环境变量读取
String downloadUrl = "https://api.telegram.org/file/bot" + botToken + "/" + telegramFile.getFilePath();
// 3. 流式下载并保存(自动保留原始格式与质量)
try (InputStream is = new URL(downloadUrl).openStream();
FileOutputStream os = new FileOutputStream(new File(saveDir, fileId + "." + getFileExtension(telegramFile.getFilePath())))) {
is.transferTo(os); // Java 9+ 推荐;兼容旧版可用 byte[] 缓冲复制
}
}
// 辅助方法:从 filePath 提取扩展名(如 "photos/AgACAgQAAxkBAAICZGZv...jpg" → "jpg")
private String getFileExtension(String filePath) {
return Optional.ofNullable(filePath)
.filter(f -> f.contains("."))
.map(f -> f.substring(filePath.lastIndexOf(".") + 1))
.orElse("jpg");
}⚠️ 关键注意事项
-
不要硬编码 bot token:务必通过
@Value("${telegram.bot.token}")或Environment注入,禁止写死在代码中; -
选择最大尺寸照片:
msg.getPhoto()返回按尺寸升序排列的List<photosize></photosize>,索引get(photoList.size() - 1)即为最高清版本(通常width × height ≥ 1280×?); -
目录安全创建:执行前确保
saveDir存在,建议添加:File dir = new File(saveDir); if (!dir.exists()) dir.mkdirs();
-
异常处理与日志:生产环境需捕获
TelegramApiException(网络/权限错误)和IOException,并记录详细日志; -
文件命名优化(可选):可用时间戳 + 用户ID + file_id 组合命名,避免冲突,例如:
20240520_123456789_AgACAgQAAx...jpg; - PNG/GIF 支持:Telegram 原生支持 PNG/GIF 格式上传,若用户发送的是非 JPG 图片(如透明背景截图),上述逻辑会自动保留原始格式与质量,无需强制转 JPG。
✅ 为什么“photoSize.getDate.getInputStream()”失效?
该方法属于极早期(v3.x 及更旧)TelegramBots SDK 的废弃 API,现代版本(v5.3+)已移除 getDate() 等非标准字段。当前唯一合规路径就是 getFile + HTTP 下载。
? 提示:参考官方示例项目 telegram-spring-bot 可快速验证集成逻辑,但请注意其
getFile调用部分仍需按本文方式补全下载逻辑。
通过以上方法,你将稳定获得 Telegram 服务器存储的原始高清图片(无压缩损画质),并安全落盘至本地指定目录,为后续图像处理、AI 分析或归档提供高质量数据源。

















