You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将从Telegram API下载的图片文件写入服务器?

解决Telegram图片数据写入服务器文件失败的问题

你遇到的核心问题是axios默认会将响应数据解析为UTF-8字符串,而图片属于二进制数据,转成字符串的过程中会丢失或损坏原始二进制信息,后续再转Buffer写入文件自然无法得到正常的图片。

解决方案1:指定responseType为arraybuffer

告诉axios直接返回二进制的ArrayBuffer,避免字符串编码转换带来的数据损坏:

// 修改axios请求,添加responseType配置
const photo = await axios.get(`https://api.telegram.org/file/bot${BOT_TOKEN}/photos/file_0.jpg`, {
  responseType: 'arraybuffer'
});

// 直接将ArrayBuffer写入文件(Node.js会自动处理为Buffer)
const fs = require('fs');
fs.writeFile('./images/newFile.jpg', photo.data, (err) => {
  if (err) console.error('写入失败:', err);
  else console.log('图片写入成功');
});

解决方案2:使用流式传输(适合大文件)

如果图片体积较大,用stream方式可以减少内存占用,传输更高效:

const axios = require('axios');
const fs = require('fs');

const writer = fs.createWriteStream('./images/newFile.jpg');
const response = await axios.get(`https://api.telegram.org/file/bot${BOT_TOKEN}/photos/file_0.jpg`, {
  responseType: 'stream'
});

// 将响应流管道到文件写入流
response.data.pipe(writer);

// 监听完成或错误事件
await new Promise((resolve, reject) => {
  writer.on('finish', resolve);
  writer.on('error', reject);
});
console.log('图片写入完成');

原代码的问题说明

你之前的代码中,photo.data已经是被axios转成UTF-8字符串的损坏数据,再用Buffer.from(photo.data)转换,得到的Buffer并不是原始图片的二进制数据,因此写入的文件无法正常打开。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:35:42