首页 > 其他分享 >利用jszip实现批量文件压缩下载

利用jszip实现批量文件压缩下载

时间:2024-02-21 15:47:44浏览次数:27  
标签:文件 const 批量 zip 压缩 jszip blob file

介绍

前端可以通过一个第三方库 jszip,可以把多个文件以blob、base64或纯文本等形式,按自定义的文件结构,压缩成一个zip文件,然后通过浏览器download下来。
官网:stuk.github.io/jszip/ 用法不难,直接看code:

// 先封装一个方法,请求返回文件blob
async function fetchBlob(fetchUrl, method = "POST", body = null) {
    const response = await window.fetch(fetchUrl, {
        method,
        body: body ? JSON.stringify(body) : null,
        headers: {
            "Accept": "application/json",
            "Content-Type": "application/json",
            "X-Requested-With": "XMLHttpRequest",
        },
    });
    const blob = await response.blob();
    return blob;
}

const zip = new JSZip();
zip.file("Hello.txt", "Hello World\n"); // 支持纯文本等

zip.file("img1.jpg", fetchBlob('/api/get/file?name=img.jpg', 'GET')); // 支持Promise类型,需要返回数据类型是 String, Blob, ArrayBuffer, etc
zip.file("img2.jpg", fetchBlob('/api/post/file', 'POST', { name: 'img.jpg' })); // 同样支持post请求,只要返回类型正确就行

const folder1 = zip.folder("folder01"); // 创建folder
folder1.file("img3.jpg", fetchBlob('/api/get/file?name=img.jpg', 'GET')); // folder里创建文件

zip.generateAsync({ type: "blob" }).then(blob => {
    const url = window.URL.createObjectURL(blob);
    downloadFile(url, "test.zip");
});

image
jszip还支持一些别的类型文件压缩,比如纯文本、base64、binary等等,详见:https://stuk.github.io/jszip/documentation/api_jszip/file_data.html
由于走的是纯前端压缩,所以会有延迟问题,走到最后download时才会调起浏览器下载,所以页面可能需要一个效果来更新压缩进度。zip.generateAsync方法就支持第二个参数,支持进度更新:

zip.generateAsync({ type: "blob" }, metadata => {
    const progress = metadata.percent.toFixed(2); // 保留2位小数
    console.log(metadata.currentFile, "progress: " + progress + " %");
}).then(blob => ... );

方案三:后端压缩成zip,然后以文件流url形式,前端调用download
后台加个api,然后把需要download的文件在后台压缩成zip,然后把文件流输出出来。然后就和单个文件download一样了。

因为后台会先压缩,会有延迟才会把blob返回前台,而且需要传多个文件信息,一般是post请求,所以建议使用单个文件下载的方案三通过API请求实现,在请求前后加上提示语或loading效果。

总结

本文介绍了前端单个文件的下载方案,以及批量多个文件下载的解决方案。最后整理下方案建议:

单个文件下载:

如果url是同源的,并且是一个服务器上的静态文件路径、或者是一个get请求,推荐方案二即 方式下载。
反之,方案三即API请求方式。
批量文件下载:

如果有zip压缩需求,选方案二或方案三;
如果可以接受弹Download multiple files提示,用方案一;反之方案二或方案三;
https://www.jb51.net/article/276668.htm#_lab2_2_4

标签:文件,const,批量,zip,压缩,jszip,blob,file
From: https://www.cnblogs.com/guozhiqiang/p/18025324

相关文章

  • MODIS hdf数据批量转tif数据
    PythonGDAL地学分析MODIShdf数据批量转tif数据   一、概况MODIS即中分辨率成像光谱仪(Moderate-resolutionImagingSpectroradiometer,缩写MODIS)是美国宇航局研制大型空间遥感仪器,以了解全球气候的变化情况以及人类活动对气候的影响。1998年MODIS机载模型......
  • SpringBoot+MybatisPlus+Mysql实现批量插入万级数据多种方式与耗时对比
    场景若依前后端分离版本地搭建开发环境并运行项目的教程:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662若依前后端分离版如何集成的mybatis以及修改集成mybatisplus实现Mybatis增强:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1362030......
  • 【微信/企业微信】批量发送消息
    一、背景公司运营需求,会经常给一些用户发送具有针对性的消息,用来提高用户黏性。之前每次发送都是人工处理,编辑信息,然后一个一个的手动复制粘贴发送,整个过程枯燥无味,浪费了大量的时间精力。一次偶然机会发现有现成的RPA工具,专门用来处理这种重复且规律的工作。自己下了一个,花了半......
  • 【微信/企业微信】批量添加好友
    一、背景前同事最近跳槽了,运营方面的工作,最近总是抱怨要处理各渠道的来的手机号。细问后,才知道,她需要把线上线下各种渠道手机到的用户手机号,添加到微信和企业微信好友中,然后集中运营,方便做后续运营操作,增加用户粘性和参与度。目前每次的工作量在200到500个手机号不等,每次操作要......
  • JPA批量新增,批量更新
    jpa的sava与saveAllsave()方法@Transactionalpublic<SextendsT>Ssave(Sentity){if(this.entityInformation.isNew(entity)){this.em.persist(entity);returnentity;}else{returnthis.em.merge(ent......
  • 压缩数据
    压缩文件扩展名:LZH文件储存的基本单位:1字节=8位文件内容用“数据的值*循环次数”是RLE算法Windows计算机使用的SHIFTJIS字符编码,1个半角英数用1字节表示。BMP格式的图像文件没有压缩过。压缩后能复原的是可逆压缩,无法复原是非可逆压缩文件是将数据存储在磁盘等存储媒介得一......
  • 亲自尝试压缩数据
    压缩数据,我们常用的方式由zip等进行压缩。我们进行压缩是因为,有些文件不方便存储。1.先了解保存文件中的数据形式:文件以字节为单位保存。文件是字节数据的集合体。无论在任何情况下,文件中的字节数据都是连续储存的。2.认识RLE算法的机制:RLE就是把文件内容用“数据*重复次数”的......
  • 压缩数据
    文件是字节数据的集合体,文件时以字节为单位记录的。zip是Windows标准支持的压缩文件扩展名,BMP格式的图片文件是没有经过压缩的,因此比PNG等压缩格式的图片文件要大。像照片这样子只要恢复出来的数据人眼几乎看不出差别,就可以使用有损压缩。压缩后的数据可以恢复成原始数据的是无损......
  • 基于huffman编解码的图像压缩算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述       Huffman编码是一种用于无损数据压缩的熵编码算法。由DavidA.Huffman在1952年提出。该算法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffm......
  • 亲自尝试压缩数据
        在学习压缩文件前需要先了解文件是将数据存储在磁盘等存储媒介中的一种形式,并且程序文件中存储数据的单位是字节,这也是为什么文件的大小用xxKb或xxMb等来表示市的原因。文件又是什么呢?它就是字节数据的集合,而且文件包括文本文件和图像文件,另外我们需要特别注意任何情况......