react——利用jszip实现文件批量下载并打包成zip文件

news/2025/2/9 7:32:40 标签: 批量下载, 下载mp4, jszip, react

本文章主要记录利用jszip实现文件批量下载图片,文档。mp3,视频(MP4)等文件,一般而言前端实现下载功能一般都是通过a链,这在下载单个文件的场景很实用,但如果是批量下载很多个文件,同样也可以用a链接实现但是当文件很多的时候浏览器下方会一下子弹出很多个单个文件,这个对于用户交互是不友好的,如下图所示(当然如果用户不吐槽,这种方式对于开发而言,是最简单快速的):

总结批量下载的一般实现方案:

1.借助后端,让后端大佬接口直接返回一个已经打包好的zip静态资源链接,前端获取链接直接下载;

2.利用如下所说的a链接方式,遍历列表,然后a链接下载;

3.利用jszip把所有文件下载到一个zip文件下载下来;

 由于后端大佬没时间,所以就尝试在前端打包,实现过程如下:

1.先引入相关的npm包

npm i --save axios jszip file-saver

2. 核心代码如下:

  // 请求文件资源
  const getFile = useCallback((url: string) => {
    return new Promise((resolve, reject) => {
      axios({
        method: 'get',
        url,
        responseType: 'blob',
      }).then((data) => {
          resolve(data.data);
        }).catch((error) => {
          reject(error.toString());
        });

    });
  }, []);

  // 批量下载
  const patchDownload = useCallback(async () => {
    const zip = new JSZip();
    const imgsss: JSZip | null = zip.folder('批量下载');
    const promises: Promise<T>[] = [];
    data.forEach((item) => {
      const promise = getFile(item.download_url).then((data: any) => {
        // 下载文件, 文件名必须带有文件类型后缀
        const file_name = `${item.name}.${item.file_format}`;
        // 逐个添加文件
        imgsss?.file(file_name, data, { binary: true }); 

      });
      promises.push(promise);
    });
    Promise.all(promises).then(() => {
      zip.generateAsync({ type: 'blob' }).then((content) => {
        // 生成二进制流,利用file-saver保存文件
        FileSaver.saveAs(content, '批量下载.zip');
      }).catch(()=>{
        // 如果有资源文件下载失败,就直接用a链接下载
        dataSource.forEach((item) => {
          File.download({ url: item.download_url, fileName: item.name });
        });
      });

    });
  }, [data, getFile]);

 


http://www.niftyadmin.cn/n/640677.html

相关文章

【docker】docker 搭建 mongodb3.6,开启授权访问

首先下载mongodb3.6镜像&#xff1a; docker pull mongo:3.6mongodb通常占用27017端口&#xff0c;最简单的启动方式如下&#xff1a; docker run --name mongodb -p 27017:27017 -d mongo:3.6不过通常情况下&#xff0c;我们不会直接这样启动。我们需要绑定数据卷&#xff0c;…

window10上配置Ant环境变量

一、下载ANT安装包 下载地址&#xff1a;http://ant.apache.org/bindownload.cgi 百度网盘下载链接&#xff1a;https://pan.baidu.com/s/1-Fgw2lU3nQKsUktSCVar7A 提取码&#xff1a;2ynr 二、配置环境变量 步骤1、选中【此电脑】右键-【属性】-【高级系统设置】&#xff0…

鼠标悬停显示禁用图标

cursor:not-allowed;//是禁用的样式 一个圆圈中间一个斜杠 //其中还有一个属性也是这个样式 cursor:no-drop;

CSS圆角

border-radius 此CSS属性用于做圆角 box-shadow 此CSS属性用于做阴影效果 文章链接http://www.cnblogs.com/lianjun/archive/2011/03/11/1981606.html转载于:https://www.cnblogs.com/manyiString/archive/2012/10/18/2729396.html

eslint用于忽略部分代码的校验的4种注释语句

01.关闭段落校验 /* eslint-disable */some code some code /* eslint-enable */02.关闭当前行校验 some code // eslint-disable-line03.关闭下一行校验 // eslint-disable-next-line some code04.关闭整个文件校验 /* eslint-disable */

JMeter接口测试之multipart/form-data 文件表单上传

一、创建一个测试计划&#xff0c;并在测试计划下创建一个HTTP请求默认值&#xff1b; 填写默认请求信息&#xff0c;实例如下&#xff1a; 协议&#xff1a;http 服务器名称或IP&#xff1a;192.168.1.177 端口号&#xff1a;8080&#xff08;默认80端口可忽略不填&#xff0…

vue——动态吸顶组件

因需要实现一个动态的吸顶组件&#xff0c;吸顶之后的目标对象根据滚动条的滚动位置动态增加&#xff0c;效果如下&#xff1a; 组件代码如下&#xff1a; export default {created () {if (!this.handleScroll_mixin) {throw new Error("【scrollWebviewMixin】handleSc…

记一次邮件服务器***的案例

一天&#xff0c;某位朋友告诉我查看邮件服务器的负载过高 load average&#xff1a;271.81&#xff0c;261.82&#xff0c;244.85 其中53.4%id和43.0%wa 看出cpu虽然很闲 但是cpu的时间都用了等待了&#xff0c;等待io设备&#xff0c;由于平时正常业务量不至于带来如此大负载…