如何将从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
相关产品推荐
相关产品推荐

