资讯专栏INFORMATION COLUMN

通过 Node 批量下载文件到本地(多文件)

plus2047 / 1147人阅读

摘要:包批量下载虽然说可以遍历所有文件,然后去批量下载单个文件,但是这种体验毕竟不太好,最常见的做法是把批量的文件下载并打包到中。

最近在做一个文件下载的功能,这里把做的过程中用的技术和坑简要总结下。
上篇文章《通过 JavaScript 下载文件到本地(单文件)》说了下如何下载单文件,这篇主要说下如何做多文件的批量下载
多文件分别处理

如果文件数量可控,对于下载出来的文件格式无要求,可以用最简单的办法,直接遍历文件,分别给每个下载链接创建一个单文件的download或者iframe下载链接。

zip包批量下载

虽然说可以遍历所有文件,然后去批量下载单个文件,但是这种体验毕竟不太好,最常见的做法是把批量的文件下载并打包到zip中。

所以首先的一个实现思路是:在代理服务里,先去遍历所有的文件去请求文件数据,然后压缩到zip包中,然后再把zip包返回给客户端。

这么做对于下载量数据比较小时ok,但是如果批量文件特别多特别大时,用户要等后台把所有的数据都请求到并且都打包都压缩包里,前端才能有反馈,这个时间可能会耗时很长,用户体验可能很差。

在同事的前期调研时,有说这里可以做一个流式的边压缩边下载的能力,大致的思路是,chunk回包,加流式压缩

......

let fileCounter = 0;
const zippedFilename = encodeURIComponent(downloadData.name);
const list = downloadData.list || [];
const header = {
  "Content-Type": "application/x-zip",
  "Pragma": "public",
  "Expires": "0",
  "Cache-Control": "private, must-revalidate, post-check=0, pre-check=0",
  "Content-disposition": "attachment; filename="" + zippedFilename + """,
  "Transfer-Encoding": "chunked",
  "Content-Transfer-Encoding": "binary"
};
res.writeHead(200, header);
archive.store = true;
archive.pipe(res);
list.map(item => {
  fileCounter++;
  let inStream = request.get(item.downLoadUrl);
  let name = item.fileName;
  let length = 0;
  inStream.on("response", function(awsData) {
    archive.append(inStream, {
      name: name
    });
  }).on("data", function(data) {
    length += data.length;
  }).on("error", function(e) {
    console.error(name + "-error", e);
  }).on("end", function(endData) {
    fileCounter--;
    if (fileCounter < 1) {
      archive.finalize();
    }
  });
});
archive.on("error", function(err) {
  throw err;
});
archive.on("finish", function(err) {
  return res.end();
});

......

当然中间还有些细节需要处理:比如中文文件名的问题,是否需要下载文件总大小做限制,是否会出现文件不存在等等情况。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102582.html

相关文章

  • Node 批量爬取头条视频并保存

    摘要:目标网站西瓜视频项目功能下载头条号维辰财经下的最新个视频项目地址地址姊妹项目批量下载美女图集简介一般批量爬取视频或者图片的套路是,使用爬虫获得文件链接集合,然后通过等方法逐个保存文件。然而在批量下载时,逐个手动的获取视频链接显然不可取。 目标网站:西瓜视频 项目功能:下载头条号【维辰财经】下的最新20个视频 项目地址:Github 地址 姊妹项目:批量下载美女图集 简介 一般批量...

    Jioby 评论0 收藏0
  • 使用hexo+github搭建免费个人博客详细教程

    摘要:如果实在不会安装可以去网上找教程。打开,跳转到刚刚创建的文件夹位置,运行命令然后会在你的文件夹中搭建好了环境配置配置修改一些你的博客名字描述作者等。基于我的个人经验,建议都开启开启标签页命令,在博客目录添加元数据开启分类页命令,在博 Windows环境下Git安装、配置SSH key、安装node.js npm、安装Hexo及配置、发布博客 前言 使用github pages服务搭建博客的...

    番茄西红柿 评论0 收藏0
  • 超好用的谷歌浏览器、Sublime Text、Phpstorm、油猴插件合集

    摘要:分享一些超好用插件,打造一个不一样的浏览器编辑器。一谷歌浏览器插件谷歌访问助手强烈推荐一键安装,无需其他配置,即可访问谷歌。谷歌浏览器是很耗内存的,该插件会自动挂起长时间未使用的网页,来释放系统资源。 showImg(https://segmentfault.com/img/remote/1460000014011338); 分享一些超好用插件,打造一个不一样的 GitHub、浏览器、...

    Rango 评论0 收藏0

发表评论

0条评论

plus2047

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<