如何在没有任何额外包的情况下使用 NodeJS 下载文件

news2024/9/25 10:35:30

如何在没有任何额外包的情况下使用 NodeJS 下载文件

您可以下载文件(图像、文本或任何类型的文件)并使用 NodeJS 内置 httpsfs模块将其保存到您的文件系统。

https模块允许您使用 NodeJS 创建 HTTPS 请求,同时该 fs模块授予您访问文件系统的权限。

通过组合这两个模块,您可以创建一个 HTTPS GET 请求并将响应流作为一个新文件写入您的文件系统。

首先,使用以下方法创建一个名为的新文件 download.js并将两个模块导入到您的脚本中:require()

const https = require("https");
const fs = require("fs");

然后,创建一个 url可以在 Internet 上公开访问的文件的字符串。

例如,我将尝试从 .png的网站下载图片:

const url = "网上图片的地址";

接下来,调用该 https.get()方法并将 url变量作为其第一个参数传递。该方法的第二个参数将是 callback您希望在收到响应流后运行的函数:

https.get(url, (res) => {
  // TODO: create a writable stream
  // and save the received data stream
});

在函数内部 callback,将要保存的文件的名称写为变量 path。例如,我想保存图像并将其命名为 downloaded-image.png"

https.get(url, (res) => {
  const path = "downloaded-image.png";
});

现在您需要使用 fs.createWriteStream()方法创建一个新的可写流并将 path变量作为其参数传递。默认情况下,该 fs模块将在当前文件夹上创建可写流:

https.get(url, (res) => {
  const path = "downloaded-image.png";
  const writeStream = fs.createWriteStream(path);
});

最后,使用方法将 GET响应数据流发送到对象。当发送信号时,关闭对象:writeStream``pipe()``writeStream``finish``writeStream

https.get(url, (res) => {
  const path = "downloaded-image.png";
  const writeStream = fs.createWriteStream(path);

  res.pipe(writeStream);

  writeStream.on("finish", () => {
    writeStream.close();
    console.log("Download Completed");
  });
});

完整的JavaScript代码如下所示:

const https = require("https");
const fs = require("fs");

// URL of the image
const url = "http://sop.zszhenpin.com/_pc_sy_PAj6d__.html2?utm_source=baiduPC&utm_medium=%E8%87%BB%E5%93%81%E5%9B%BD%E9%99%85F14&utm_term=A9%2D%E3%80%90sy%E9%AB%98%E3%80%91&utm_content=%E6%97%85%E6%B8%B8&utm_campaign=%E6%97%85%E6%B8%B8%E5%A4%9A%E5%B0%91&bd_vid=9052837594730046416";

https.get(url, (res) => {
  const path = "downloaded-image.png";
  const writeStream = fs.createWriteStream(path);

  res.pipe(writeStream);

  writeStream.on("finish", () => {
    writeStream.close();
    console.log("Download Completed");
  });
});

您可以使用命令执行脚本 node以查看它的运行情况:

node download

此外,您还可以向脚本提供两个命令行参数,如下所示:

  • 第一个参数将是您要下载的文件的 URL
  • 第二个参数将是将保存到文件系统的文件的名称

您可以从属性中获取命令行参数 process.argv,并在用户未将两个参数都传递给脚本时停止脚本:

const { argv } = process;
const [, , url, path] = argv;

if (url === undefined) {
  console.log(`The 'url' argument is missing. 
    You need to pass the file url as the first argument`);
  return;
}

if (path === undefined) {
  console.log(`The 'path' argument is missing. 
    You need to pass the save path as the second argument`);
  return;
}

将上面的代码传递到导入的正下方,如下所示:

const https = require("https");
const fs = require("fs");

const { argv } = process;
const [, , url, path] = argv;

if (url === undefined) {
  console.log(`The 'url' argument is missing. 
  You need to pass the file url as the first argument`);
  return;
}

if (path === undefined) {
  console.log(`The 'path' argument is missing. 
  You need to pass the save path as the second argument`);
  return;
}

https.get(url, (res) => {
  const writeStream = fs.createWriteStream(path);

  res.pipe(writeStream);

  writeStream.on("finish", () => {
    writeStream.close();
    console.log("Download Completed");
  });
});

这样,您就可以重新使用该 download.js文件从 URL 下载文件。每次执行脚本时,从命令行传递所需参数 url和参数。path

下面的示例将从第一个参数下载图像并将其另存为 image.png

node download ‘网上图片地址’

这就是您可以使用 NodeJS 下载文件而无需安装任何额外包的方法。

有时,您可能需要下载多个文件并将它们保存到您的系统中。

我建议您使用 npm download包而不是编写自己的代码。

download软件包允许您下载多个图像并将它们保存在一个文件夹下,如下所示:

const download = require("download");

(async () => {
  await Promise.all(
    [
      "第一张图片地址",
      "第二张图片地址",
    ].map((url) => download(url, "dist"))
  );
})();

上面的代码将 default.pngnathan-sebhastian.png文件都保存到 ./dist文件夹中。查看downloadnpm 页面以获取更多信息。

去npm 官网可以看到download 模块的用法:

image.png

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/376491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VR全景的普及还将会带来什么新的风口?

5G技术的普及让VR全景在诸多行业中逐渐融合应用,VR全景展示可以更加真实、更加直观地让用户自主观看现场真实场景,基于身临其境的效果,VR全景展示已经被广泛的应用于各行各业,那么VR全景的普及还将会带来什么新的风口呢&#xff1…

FAST‘23《λ-IO: A Unified IO Stack for Computational Storage》论文解读

FAST’23《λ-IO: A Unified IO Stack for Computational Storage》论文解读 Data:2023-2-27 Ref: Z. Yang et al., “λ-IO: A Unified IO Stack for Computational Storage,” in 21st USENIX Conference on File and Storage Technologies (FAST 23), Santa Clara, CA, Feb.…

我的Android前沿技术—— Artifactory私服 搭建

我们说的私服,其实指的是企业局域网内的软件包依赖库。 说到软件库,就会牵扯出另一个概念——包管理器。 包管理器是在电脑中自动安装、配置、卸载和升级软件包的工具组合。包管理器由于其便捷性,被越来越多的新技术所采纳,从老…

Cesium 编程入门

Cesium 是什么? Cesium 是一个跨平台、跨浏览器的展示三维地球和地图的Javascript库。 Cesium 使用WebGL 来进行硬件加速图形,使用时不需要任何插件支持,但是浏览器必须支持WebGL。 Cesium能做什么? 支持2D、2.5D、3D形式的地图展…

Java代码规范

前言 由于近年来对于代码质量的要求越来越高,特制定部门级Java代码规范规则集X-JAVA-RULE,整体要求规则可用可查、循序渐进。 可用是指考虑目前已有代码的体量,不满足这些规则的代码能否能被修复,如果工作量巨大不能被修复或者实…

小程序和Vue+uniapp+unicloud培训课件

文章目录**一、什么是小程序****1.1** **小程序简介****1.2** **小程序的特点****1.3** **小程序的开发流程**个人小程序和企业小程序的区别1.4 小程序代码构成1.4.1 JSON 配置1.4.2 WXML 模板**数据绑定**逻辑语法条件逻辑列表渲染模板引用共同属性1.4.3 WXSS 样式1.4.4 JS 逻…

9. IP组播(理论)

作为IP传输三种方式之一,IP组播通信指的是IP报文从一个源发出,被转发到一组特定的接收者。相较于传统的单播和广播,IP组播可以有效地节约网络带宽、降低网络负载,所以被广泛应用于IPTV、实时数据传送和多媒体会议等网络业务中。 …

5 逻辑回归及Python实现

1 主要思想 分类就是分割数据: 两个条件属性:直线;三个条件属性:平面;更多条件属性:超平面。 使用数据: 5.1,3.5,0 4.9,3,0 4.7,3.2,0 4.6,3.1,0 5,3.6,0 5.4,3.9,0 . . . 6.2,2.9,1 5.1,2.5…

一个容易被忽视的标签 —— iframe

前言 甲问:说说你知道的HTML标签。 乙于是说了一大堆标签,比如div,span等等。 甲说:那你知道 iframe 标签吗? 乙这时候迟疑了片刻,缓缓说出:知道它,但是不太了解这个标签。 HTM…

学到了,原来华为是这样判断MES系统的好坏的

可以想象华为公司对供应商的要求是多么严格,那么我们今天来谈一下华为对供应商工厂MES系统这块的要求,这要从生产防错系统、品质管控系统、品质追溯系统、出货防错系统四个方面来说。一、生产物料和生产治具防错系统建立完整的物料和治具标签方案&#x…

常用的数据脱敏(手机、邮箱、身份证号)

一、什么是数据脱敏 先来看看什么是数据脱敏?数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如 手机号、银行卡号 等信息,进行转换或者修改的一种技术手段,防止敏感数据直接在不可靠的环境…

AcWing3485. 最大异或和

先看题目: 说实话,我看到这道题就想用滑动窗口,但是滑了一下发现不太对啊,如果我用滑动窗口的话,那么最后肯定是一个固定长度为m的窗口在持续计算,区间长度小于m的区间的异或和肯定会被遗漏。然后我就想怎么…

vue前端架构说明书模板示例

目录 1. 技术说明... 2 1.1 版本明细... 2 1.2 核心技术介绍... 2 2. 项目结构说明... 3 3. 自动化部署设置说明... 5 4. 打包及运行说明... 5 5. 导包说明... 6 5.1 方案一... 6 5.2 方案二... 7 5.3 补充说明... 7 6. 修改本地运行时链接的服务器说明... 7 7. 常…

从 B 站出发,用 Chrome devTools performance 分析页面如何渲染

页面是如何渲染的?通常会得到“解析 HTML、css 合成 Render Tree,就可以渲染了”的回答。但是具体都做了些什么,却很少有人细说,我们今天就从 Chrome 的性能工具开始,具体看看一个页面是如何进行渲染的,以及…

视频传输协议详解(RTMP、RTSP、HLS)

RTMP——Real Time Messaging Protocol(实时消息传输协议)RTMP是由Adobe公司提出的,在互联网TCP/IP五层体系结构中应用层,RTMP协议是基于TCP协议的,也就是说RTMP实际上是使用TCP作为传输协议。TCP协议在处在传输层&…

sql学习一

文章目录一、if 语句二、去重问题三、concat,upper,lower四、group_concat五、like 模糊匹配六、union和union all七、流程控制语句case八、limit一、if 语句 if(expr1, expr2, expr3)当expr1的值为真时函数的返回值为expr2,当expr1的值为假时,函数的返…

安装redis并设置开机自启动允许远程链接

一、进入/usr/local目录下面;下载redis包wget https://download.redis.io/releases/redis-5.0.14.tar.gz二、安装gccyum install gcc-c三、解压、进入目录、编译tar -xvf redis-5.0.14.tar.gzcd redis-5.0.14make ##如果报错zmalloc.h:50:31: 致命错误:j…

打破单片机开发模式--胶水语言(JavaScript)

概述 传统的嵌入式单片机开发基本上形式如下图: 该流程对于功能单一或者功能变更极少的场景是比较友好的,但是对于设备应用层变更比较多或者公板方案开发应用的场景,上述场景显的有些累赘。那么有什么方式可以解决呢?&#xff1f…

U-Boot 之七 详解 Driver Model 架构、配置、命令、初始化流程

U-Boot 在 2014 年 4 月参考 Linux Kernel 的驱动模型设计并引入了自己的 Driver Model(官方简称 DM) 驱动架构。这个驱动模型(DM)为驱动的定义和访问接口提供了统一的方法,提高了驱动之间的兼容性以及访问的标准性。 …

和月薪3W的聊过后,才知道自己一直在打杂...

前几天和一个朋友聊面试,他说上个月同时拿到了腾讯和阿里的offer,最后选择了阿里。 我了解了下他的面试过程,就一点,不管是阿里还是腾讯的面试,这个级别的程序员,都会考察项目管理能力,并且权重…