首页 > 其他分享 >前端JSZip结合file-saver下载文件打包导出压缩文件

前端JSZip结合file-saver下载文件打包导出压缩文件

时间:2024-06-12 14:32:47浏览次数:25  
标签:文件 const 压缩 JSZip let file 压缩文件 下载

需求场景: 前端拿到下载文件的url,请求并将文件进行分类压缩生成压缩包导出

前端导出文件的优点:

  1. 减轻服务器负担: 后端生成压缩文件可能会占用服务器资源和时间。如果压缩的内容很大,可能会导致服务器压力增加,影响其他用户的访问速度。将这些任务转移到前端可以减轻服务器负担,提高整体系统的性能和稳定性。

  2. 用户体验: 前端实现可以提供更即时的用户反馈,用户可以立即看到下载进度和结果。此外,用户不需要等待服务器响应,可以立即开始下载,提高了用户体验。

  3. 灵活性和可控性: 前端可以更灵活地控制下载和压缩过程,根据用户的操作或需求进行相应的处理。例如,可以根据用户的选择动态生成压缩文件,或者根据用户的操作实时更新下载进度。

  4. 客户端资源利用: 前端实现可以充分利用客户端的计算资源,如浏览器的性能和内存,更高效地处理文件下载和压缩。

尽管在某些情况下,后端生成压缩文件可能更合适,特别是当需要处理大量或敏感数据时,为了确保安全性和数据完整性,可以在服务器端完成文件处理。但总体来说,在大多数情况下,将文件下载和压缩任务放在前端实现更为合适。

解决方案

使用jszip和file-saver插件

JSZipFileSaver 是 JavaScript 库,它们分别用于处理压缩文件和文件保存的操作。下面是它们的作用:

  1. JSZip: JSZip 是一个可以创建、读取和修改 ZIP 文件的 JavaScript 库。它允许你在客户端(浏览器)中动态生成 ZIP 文件,将多个文件或文件夹压缩成一个 ZIP 包,也可以解压已有的 ZIP 文件。在前端开发中,JSZip 可以用于在浏览器中生成和处理压缩文件,非常适合需要在客户端进行文件压缩和解压缩的场景。

  2. FileSaver: FileSaver 是一个用于在客户端保存文件的 JavaScript 库。它提供了一种简单的方式来将数据保存为本地文件,通常用于在浏览器中将动态生成的内容(如图像、文档、压缩文件等)保存到用户的计算机上。FileSaver 可以将 Blob 或 File 对象保存为本地文件,支持设置文件名和文件类型,非常适合用于下载动态生成的文件。

在需要的情境中,JSZip 用于在客户端中创建和处理压缩文件,将多个文件打包成一个 ZIP 文件;而 FileSaver 则用于在客户端将生成的 ZIP 文件保存到用户的计算机中,以供用户下载和使用。这两个库通常结合使用,能够方便地处理前端的文件压缩和下载需求。

实现方法

npm i [email protected]
npm i [email protected]

页面中应用

import JSZip from 'jszip'
import FileSaver from 'file-saver'
 downloadPdf () {
      let title = '测试' 
      const flag = [
        'o2dTk5MjJmcHRucmh0dDRJOUZHRlhpZmxQWFZiTlh5VUZ5VWI5az0', // 请求参数
        'axaVMyeXhYbitFTWtwaFdZNTZIMzdQcTM4RE5JeFBuZENpMElJZz0',
        'T2h0QS9UekxzRaZEF0QTM4V2ZQRzl0U25SVGpEcWI3YW1ITm5yWT0',
        'MjFFV0xxx2SEM3RVJDZzNlUCtHRUdkcUtpU0UySHZWakFlQXBUTT0',
        'b1ZnYjY1OG3433RmhDb09NS1lOOUxocVFVcEZtZXBQb1BXendWbz0'
      ]
      const loading = this.$loading({ // 加载状态
        lock: true,
        text: '正在导出,请等待。。。',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
       // 这里的应用场景是页面中有多个附件需要下载导出 
      // 创建一个 promises 数组,用于存储每个请求的 promise 循环请求
      const promises = flag.map((id) => {
        return axios({
          url: `/frontend/api/common/downloadattchment?id=${id}&type=download`,
          method: 'GET',
          responseType: 'blob' // important
        })
      })
      // 使用 Promise.all 等待所有请求完成
      Promise.all(promises).then((responses) => {
        var zip = new JSZip()
        // 遍历每个请求的响应
        responses.forEach((response, index) => {
          const disposition = response.headers['content-disposition'] // 获取 HTTP 响应中头部字段 获取下载文件的文件信息
          const matches = /filename="(.+?)"/.exec(disposition) // 获取文件名
          const fileName = matches !== null && matches[1] ? matches[1] : `file${index + 1}`
          let decodedFileName = decodeURIComponent(fileName) //  URL 解码文件名
          const fileType = fileName.split('.').pop() // 获取文件类型后缀名
          const url = response.data
          // 添加文件到压缩包中
          zip.folder('报告').file(`${decodedFileName}.${fileType}`, url)
        })
        // 获取PDF文件并添加到压缩包中这里是单独获取base64编码格式的pdf图片数据 由base64                        
        转换为bolb二进制文件流
        getSinglePdf(title, 'pdfWarp').then((res) => {
          if (res) {
            let pdfBase64Str = res.split(';base64,')
            let byteCharacters = atob(pdfBase64Str[1])
            let byteNumbers = new Array(byteCharacters.length)
            for (let i = 0; i < byteCharacters.length; i++) {
              byteNumbers[i] = byteCharacters.charCodeAt(i)
            }
            let byteArray = new Uint8Array(byteNumbers)
            let pdfBlob = new Blob([byteArray], { type: 'application/pdf' })
            zip.folder('PDF').file(`${this.reportInfo.title.slice(0, this.reportInfo.title.indexOf(':'))}.pdf`, pdfBlob)
            // 生成并下载压缩文件  compression压缩模式 DEFLATE:可以压缩 STORE:不进行压缩,直接存储原始数据。 level压缩等级1-9 1最快9压缩率最高
            // compressionsh: BZIP2:使用 BZIP2 算法进行压缩。BZIP2 通常提供了更高的压缩率,但可能会稍微慢一些。 LZMA:使用 LZMA 算法进行压缩。LZMA 通常提供了最高的压缩率,但也是最慢的。
            zip.generateAsync({ type: 'blob', compression: 'DEFLATE', compressionOptions: { level: 9 } }, (data) => {
              const { percent } = data // 导出进度
              if (percent === 100) {
                loading.close()
              }
              console.log(percent, 'percent')
            }).then(function (content) {
              // 使用 FileSaver 保存下载 zip 文件
              FileSaver.saveAs(content, `${title}.zip`)
            })
          }
        })
      })
    },

导出后效果

标签:文件,const,压缩,JSZip,let,file,压缩文件,下载
From: https://blog.csdn.net/sh11223312/article/details/139524521

相关文章

  • 【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、流程控制if
    本文给出了cmake中的一些常用的指令,可以快速了解,为后面的内容深入打点基础。本专栏的详细实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流注释#行注释#[[多行注释]]message(""#[[这里也可以注释]]"")message在学习时......
  • FileCodeBox --一个文件快递柜
    介绍什么是FileCodeBox?以下内容摘至Github:匿名口令分享文本,文件,像拿快递一样取文件它的特点有什么?以下内容摘至Github:轻量简洁:Fastapi+Sqlite3+Vue2+ElementUI轻松上传:复制粘贴,拖拽选择多种类型:文本,文件防止爆破:错误次数限制防止滥用:IP限制上传次数口令分享:......
  • 使用PyTorch Profiler进行模型性能分析,改善并加速PyTorch训练
    如果所有机器学习工程师都想要一样东西,那就是更快的模型训练——也许在良好的测试指标之后加速机器学习模型训练是所有机器学习工程师想要的一件事。更快的训练等于更快的实验,更快的产品迭代,还有最重要的一点需要更少的资源,也就是更省钱。熟悉PyTorchProfiler然后就可以启动te......
  • Zgo - Read Files
     packagemainimport("bufio""fmt""io""os")funclineByLine(filestring)error{f,err:=os.Open(file)iferr!=nil{returnerr}deferf.Close()r:=bufio.......
  • FlinkSQL 运行官网的 filesystem SQL 连接器例子出错:Cannot discover a connector usi
    我的例子程序是仿照官网例子写的:我的程序:packagecom.xxx.demo;importorg.apache.flink.streaming.api.datastream.DataStream;importorg.apache.flink.streaming.api.environment.StreamExecutionEnvironment;importorg.apache.flink.table.api.bridge.java.StreamTabl......
  • FileLink跨网文件交换系统:银行业务诸多挑战解决方案
    随着银行业务的快速发展和数字化转型的深入推进,跨网文件传输成为了银行业务中不可或缺的一环。然而,由于银行业务的特殊性,跨网文件传输面临着诸多挑战,如数据安全性、传输效率以及合规性等问题。为了解决这些难题,FileLink文件摆渡系统应运而生,以其卓越的安全性能和高效的传输能力......
  • nofile参数的学习与整理
    nofile参数的学习与整理背景前段时间正好总结了文件描述符泄露的问题.最近在客户现场,也遇到了一个问题.其实两个问题都是因为nofile参数限制所引发.所以总结一下:nginx的worker的连接数是受到到nofile的限制的.虽然那可以通过修改配置文件和直接ulimit-HSn进......
  • The field file exceeds its maximum permitted size of 1048576 bytes
    问题—基于Springboot项目,文件上传功能报错Causedby:Thefieldfileexceedsitsmaximumpermittedsizeof1048576bytes.文件的大小超出了允许的范围。错误原因SpringBoot内嵌的Tomcat默认的所有上传的文件大小为1MB,超出这个大小就会报错,解决这个问题需要更改以下......
  • Docker大学生看了都会系列(八、Dokcerfile部署go项目)
    系列文章目录第一章Docker介绍第二章2.1Mac通过Homebrew安装Docker第二章2.2CentOS安装Docker第三章Docker常用命令第四章常用命令实战第五章Docker镜像详解第六章Docker容器数据卷第七章Dockerfile详解第八章Dokcerfile部署go项目文章目录一、前言......
  • 解决系统too many open files
    .背景nofile不足引起的toomanyopenfiles故障报警频繁出现2.文件描述符的定义与功能文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回......