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

Node.js中如何保存Telegram Bot接收的文件?从URL或流保存至临时目录的实现方法

如何将Telegram Bot接收的文件保存到临时目录

嘿,刚好我之前处理过类似的需求,其实用Node.js的流处理就能轻松搞定!你已经拿到了文件流,接下来只需要把这个流写入到临时目录的文件里就行。下面给你两种可靠的实现方式:

方法一:使用pipe(简单直接)

Node.js的流自带pipe方法,可以直接把文件流导入到本地文件的写入流中。不过要记得处理可能出现的错误,比如流中断、权限问题等。

方法二:使用stream.pipeline(推荐,更安全)

stream.pipeline是Node.js官方推荐的流处理方式,它会自动处理流的关闭、错误捕获,避免内存泄漏,比单纯的pipe更健壮。

完整代码示例

我修改了你的代码,加入了临时目录的处理和文件保存逻辑:

#!/usr/bin/env node
const process = require('process');
const fs = require('fs');
const path = require('path');
const os = require('os');
const { pipeline } = require('stream/promises'); // 用Promise版的pipeline,适配async/await
const TelegramBot = require('node-telegram-bot-api');

const token = process.env.TELEGRAM_BOT_TOKEN || '5xxxxxxxxxxxxx';

const bot = new TelegramBot(token, {polling: true});

bot.on('document', async (data) => {
  console.log('收到文件:', data.document);
  
  // 获取系统默认临时目录(跨平台兼容:Windows是%TEMP%,Linux/macOS是/tmp)
  const tempDir = os.tmpdir();
  // 生成临时文件路径:加时间戳前缀避免同名文件覆盖
  const tempFilePath = path.join(tempDir, `${Date.now()}_${data.document.file_name}`);

  try {
    const stream = await bot.getFileStream(data.document.file_id);
    
    // 方法一:使用pipe(简单版)
    // stream.pipe(fs.createWriteStream(tempFilePath))
    //   .on('finish', () => {
    //     console.log(`文件已保存到临时目录:${tempFilePath}`);
    //     // 这里可以继续处理保存后的文件
    //   })
    //   .on('error', (err) => {
    //     console.error('保存文件失败:', err);
    //   });

    // 方法二:使用pipeline(推荐,更安全)
    await pipeline(
      stream,
      fs.createWriteStream(tempFilePath)
    );

    console.log(`文件已成功保存到临时目录:${tempFilePath}`);
    // 现在你可以在这个路径下处理文件啦,比如读取、解析等
    // 处理完成后如果不需要保留,记得删除临时文件:fs.unlinkSync(tempFilePath)
  } catch (err) {
    console.error('处理文件流时出错:', err);
  }
});

关键细节说明

  • 临时目录选择:用os.tmpdir()可以获取系统默认的临时目录,跨平台兼容性拉满。
  • 文件名处理:加上Date.now()前缀是为了避免同名文件被覆盖,如果需要更安全的唯一标识,也可以用crypto.randomUUID()生成随机ID。
  • 错误处理:一定要捕获流处理中的错误,否则一旦出现问题可能导致程序崩溃或者资源泄漏。
  • 后续清理:如果处理完文件不需要保留,记得调用fs.unlink()或者fs.unlinkSync()删除临时文件,避免占用磁盘空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:08:12