📅  最后修改于: 2023-12-03 14:44:37.408000             🧑  作者: Mango
在Node.js中,我们可以通过http
或https
模块来实现文件下载。但是,在下载较大的文件时,用户希望能够看到下载的进度情况。因此,本文将介绍如何使用Node.js实现文件下载进度条。
http
模块下载文件使用http
模块下载文件可以使用http.get()
方法。在该方法中,我们可以通过添加response
事件监听器来获取响应数据。
const http = require("http");
const fs = require("fs");
const file = fs.createWriteStream("bigfile.zip");
http.get("http://example.com/bigfile.zip", (res) => {
const totalSize = parseInt(res.headers["content-length"], 10);
let downloadedSize = 0;
res.pipe(file);
res.on("data", (chunk) => {
downloadedSize += chunk.length;
const percentage = (downloadedSize / totalSize) * 100;
process.stdout.write(`Downloading... ${percentage.toFixed(2)}% complete`);
});
res.on("end", () => {
console.log("File downloaded successfully!");
});
});
在上面的代码中,我们创建一个file
的写入流,用于将响应数据写入到本地文件中。然后我们通过http.get()
方法来下载文件。
注意,在res
事件中,我们添加了data
事件监听器,该事件会持续不断地触发直至文件下载完成。在data
事件监听器中,我们计算出当前已下载的文件大小,并通过进度条的方式将下载进度输出到控制台中。
axios
模块下载文件如果你更喜欢使用axios
来下载文件,则可以通过axios.get()
方法来实现。axios
模块是一个基于Promise
的HTTP客户端,可以用于浏览器和Node.js中。
const axios = require("axios");
const fs = require("fs");
const ProgressBar = require("progress");
const url = "http://example.com/bigfile.zip";
const path = "bigfile.zip";
axios({
url,
method: "GET",
responseType: "stream",
})
.then((response) => {
const totalSize = parseInt(response.headers["content-length"], 10);
let downloadedSize = 0;
const progressBar = new ProgressBar("Downloading [:bar] :percent :etas", {
width: 20,
complete: "=",
incomplete: " ",
});
response.data
.on("data", (chunk) => {
downloadedSize += chunk.length;
progressBar.tick((chunk.length * 20) / totalSize, {
percent: ((downloadedSize / totalSize) * 100).toFixed(2),
});
})
.pipe(fs.createWriteStream(path))
.on("finish", () => {
console.log("File downloaded successfully!");
});
})
.catch((error) => {
console.error(error);
});
在上面的代码中,我们使用axios
方法来下载文件,并将响应类型设置为stream
,从而使得响应数据可以通过data
事件监听器获取。我们使用ProgressBar
模块来实现进度条,并在data
事件监听器中动态地更新进度条。
现在,我们已经学会了使用Node.js实现文件下载进度条的两种方法,分别是使用http
模块和axios
模块。
如果你想使用http
模块下载文件,并且不想使用第三方模块,那么我们可以手动计算出下载进度并输出到控制台中。
如果你更喜欢使用axios
模块,那么我们可以使用ProgressBar
模块来实现进度条,并通过tick()
方法动态地更新进度条。
无论你使用哪种方法,都要记得在下载大文件时添加进度条,以便用户可以清楚地看到下载的进度情况。