📜  node js文件下载进度条 - Javascript(1)

📅  最后修改于: 2023-12-03 14:44:37.408000             🧑  作者: Mango

Node.js文件下载进度条

在Node.js中,我们可以通过httphttps模块来实现文件下载。但是,在下载较大的文件时,用户希望能够看到下载的进度情况。因此,本文将介绍如何使用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()方法动态地更新进度条。

无论你使用哪种方法,都要记得在下载大文件时添加进度条,以便用户可以清楚地看到下载的进度情况。