如何使用 Node.js 中的重定向从 https link 下载 MP4 文件?

How can I download MP4 file from https link with redirect in Node.js?

又遇到一个问题解决不了,正在学习Node.js,还有很多不懂的地方。事情如下,我有以下文件名为 downloader.js

const https = require ('https')
const fs = require ('fs')
const path = require ('path')

function downloader (url, callback) {

    const filename = path.basename (url)

    const req = https.get (url, (res) => {
        const file = fs.createWriteStream (`$ {filename} .mp4`)
        res.pipe (file)

        file.on ("error", (error) => {
            console.log (`There was an error writing the file. Details: $ {error}`)
        })

        file.on ("close", () => {
            callback (filename)
        })

        file.on ('finish', () => {
            file.close ()
            console.log ("Completely downloaded.")
        })
    })

    req.on ("error", (error) => {
        console.log (`Error downloading file. Details: $ {error}`)
    })
}

module.exports = {
    downloader
}

我有一个视频,我通过调用 Zoom api 下载了 url,其中 link:https://us02web.zoom.us/rec/download/06L34fQudvvSaAGYJ6Chk6RC0fuV-ebwyu9Ar_Ihrm4WRmD3xbpPAjnYfIFInOBz1PBPPAjnYPhoJlf4p3xbpPAjnYFIFIXMD3xbpPAjnYFIFIXMD3xbpPAjnYphoJlf4

调用下载器功能时,一切正常,我下载了mp4格式的文件,但问题是它不是mp4格式的完整700MB视频,而是mp4格式的html文件格式。

Here you can see what I mean

我不明白为什么文件下载不正确。当我处理任何其他类型的文件(例如 jpeg 图像)时,它可以毫无问题地下载它,但是对于 mp4 格式,我无法下载文件。你认为发生了什么?

鉴于您发布的 link 指向一个错误页面,指出录音不存在,我无法确认此解决方案是否有效。

但是,假设它的功能类似于其他录制 links,当在网络浏览器中导航到该位置时,您会自动重定向到新的 uri 以自动开始下载。

假设是这种情况,您真正要寻找的是如何在外部 API 请求上遵循重定向。

我会推荐 npm axios 包,因为它会自动跟随重定向。

然后您可以执行以下操作:

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

function downloader(url, callback) {
    axios({
        method: 'get',
        url: url,
        responseType: 'stream'
    })
        .then(function (response) {
            return new Promise((resolve, reject) => {
                const filename = path.basename(url);
                const file = fs.createWriteStream(`${filename}.mp4`);
                response.data.pipe(file);

                file.on("error", (error) => {
                    return reject(`There was an error writing the file. Details: $ {error}`);
                });

                file.on('finish', () => {
                    file.close();
                });

                file.on('close', () => {
                    return resolve(filename);
                });
            });
        })
        .catch(function (error) {
            // handle error
            console.log(error);
        })
        .then(function (filename) {
            callback(filename);
        })
}

module.exports = {
    downloader
};

您也可以直接 return axios promise 并使您的下载器函数 return 成为 Promise 而不是接受回调的函数。

如果您想保留 https 变量,您也可以尝试 follow-redirects 包。