Node.js 通过URL下载文件,显示进度并支持取消下载

Nodejs功能模块:

简介如下:
https => 建立远程网络连接
request => 用来请求资源
progress => 实时获取下载进度
fs => 用来创建读写流
详情请查询Nodejs官网:http://nodejs.cn/api/http.html

方法功能:边下载边存储,例:
服务器:https://blog.csdn.net/weixin_55230320?spm=1000.2115.3001.5343/文件(zip,tar.gz,exe,dll,jpg…)
本地:D:/BaiduNetdiskDownload/文件(zip,tar.gz,exe,dll,jpg…)

代码如下:
/**
 * 将远程资源下载到指定目录
 * @param {String} fileName 文件名
 * @param {String} remoteUrl 远程路径
 * @param {String} outPutPath 本地输出路径
 * @param callback '() => {}';
 */
let downloadRequest = null;
export let _remoteFile2Local = (fileName, remoteUrl, outPutPath, callback) => {
  https.get(remoteUrl + fileName, {
    rejectUnauthorized: false
  }, (res) => {
    if (res.statusCode === 200) {
      res.setEncoding(null); // 设置编码
      let str = progress({
        length: res.headers['content-length'],
        time: 500 /* ms */
      });
      str.on('progress', function (progress) {
        console.log('percentage:', progress.percentage) // 下载进度
      });
      let url = remoteUrl + fileName; // 远程文件下载地址
      let globalRequest = request.get({url: url, encoding: null, strictSSL: false}, (err, requestRes, body) => {
        if (err) throw err
        callback && callback();
      });
      // 两个pip(通道) => 下载进度监控、存储到本地路径
      globalRequest.pipe(str).pipe(fs.createWriteStream(path.join(outPutPath, fileName)));
      downloadRequest = globalRequest; // 用于取消下载
    } else {
      console.log('远程地址出错:', res.statusMessage);
    }
  })
}

/**
 * 取消下載
 * @param callback '() => {}';
 */
export let _abortDownload2 = (callback) => {
  downloadRequest.abort(); // 停止网络请求
  // to do 删除本地已经下载的文件/夹
  callback && callback();
}

// 报错 => Uncaught Error: certificate has expired
// at TLSSocket.onConnectSecure (_tls_wrap.js:1317)
// at TLSSocket.emit (events.js:203)
// at TLSSocket._finishInit (_tls_wrap.js:792)
// at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:606)

// 解决 => rejectUnauthorized: false 和 strictSSL: false
// 参考: https://www.cnblogs.com/cptao/p/12995770.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值