Skip to content

Download

The standard file download path looks like this:

  • Call getFile with file_id
  • Extract file_path from response
  • Construct a link of the following type https://api.telegram.org/file/bot<token>/<file_path>
  • Send request and download the requested media
  • ? Maybe save file in FS ?

but in our case it looks more convenient and simpler.

Via context methods

ts
bot.on("message", async (context) => {
    if (!context.document) return;
    // download to ./file-name
    await context.download(context.document.fileName || "file-name");
    // get ArrayBuffer
    const buffer = await context.download();

    return context.send("Thank you!");
});

IMPORTANT

One message contain only one attachment. Therefore, to download an attachment, you can simply use the context.download method But you can solve this using the media-group plugin.

Via bot instance method

ts
const chat = await bot.api.getChat({ chat_id: "@not_found" });

if (!chat.photo?.big_file_id) return;

// download to ./not_found_chat_photo.png
await bot.downloadFile(chat.photo.big_file_id, "not_found_chat_photo.png");
// get ArrayBuffer
const buffer = await bot.downloadFile(chat.photo.big_file_id);

WARNING

These helpers build a …/file/bot<token>/<file_path> URL. Against a local Bot API server running with --local, getFile returns an absolute disk path instead, so this URL won't resolve. See the Local Bot API Server guide for how to download files in that setup (shared volume or an nginx sidecar with token-less URLs).