如何使用 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 包。
又遇到一个问题解决不了,正在学习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 包。