diff --git a/doc/api.md b/doc/api.md index 28a0fd0..a8e7a8f 100644 --- a/doc/api.md +++ b/doc/api.md @@ -867,7 +867,9 @@ which returns the full URI to the file on remote server. ### telegramBot.downloadFile(fileId, downloadDir, [options]) ⇒ Promise Downloads file in the specified folder. -This is just a sugar for (getFile)[#getfilefiled] method + +This method is a sugar extension of the [getFileStream](#TelegramBot+getFileStream) method, +which returns a readable file stream. **Kind**: instance method of [TelegramBot](#TelegramBot) **Returns**: Promise - promise Promise, which will have *filePath* of downloaded file in resolve callback diff --git a/src/telegram.js b/src/telegram.js index a1be259..7c6b2e7 100644 --- a/src/telegram.js +++ b/src/telegram.js @@ -1355,7 +1355,9 @@ class TelegramBot extends EventEmitter { /** * Downloads file in the specified folder. - * This is just a sugar for (getFile)[#getfilefiled] method + * + * This method is a sugar extension of the [getFileStream](#TelegramBot+getFileStream) method, + * which returns a readable file stream. * * @param {String} fileId File identifier to get info about * @param {String} downloadDir Absolute path to the folder in which file will be saved @@ -1363,20 +1365,23 @@ class TelegramBot extends EventEmitter { * @return {Promise} promise Promise, which will have *filePath* of downloaded file in resolve callback */ downloadFile(fileId, downloadDir, form = {}) { - return this - .getFileLink(fileId, form) - .then(fileURI => { - const fileName = fileURI.slice(fileURI.lastIndexOf('/') + 1); - // TODO: Ensure fileName doesn't contains slashes - const filePath = path.join(downloadDir, fileName); - - // properly handles errors and closes all streams - return Promise - .fromCallback(next => { - pump(streamedRequest({ uri: fileURI }), fs.createWriteStream(filePath), next); - }) - .return(filePath); + let resolve; + let reject; + const promise = new Promise((a, b) => { + resolve = a; + reject = b; + }); + const fileStream = this.getFileStream(fileId, form); + fileStream.on('info', (info) => { + const fileName = info.uri.slice(info.uri.lastIndexOf('/') + 1); + // TODO: Ensure fileName doesn't contains slashes + const filePath = path.join(downloadDir, fileName); + pump(fileStream, fs.createWriteStream(filePath), (error) => { + if (error) { return reject(error); } + return resolve(filePath); }); + }); + return promise; } /**