vue前端下载——jszip压缩和解压,结合file-saver导出图片zip,每20个图片分一个目录

2023-11-11

使用jszip和file-saver导出图片,并打包为zip:

import JSZip from "jszip";
import FileSaver from "file-saver";

一,jszip解压缩

        使用loadAsync,zipFile为压缩包,下面的例子表示读取zip中的result.txt文件,输出内容。

const jszip = new JSZip()
jszip.loadAsync(zipFile).then((zip) => {
    zip.files["result.txt"].async("string").then(function (con) {
        console.log(con)
    });
})

二、jszip压缩 

        先搞个简单的压缩:使用jszip创建一个名为image.zip的压缩包,其中包含一个文本文档和一个文件夹。

zip.file("hello.txt", 'hello world');
zip.folder('testfolder');
zip.generateAsync({ type: "blob" }).then(function (content) {
    FileSaver.saveAs(content, "images.zip");
});

        再搞个文件夹包含文本文档的压缩:使用jszip创建一个名为image.zip的压缩包,其中包含一个testfolder文件夹,文件夹包含一个名为test.txt的文本文档。

zip.folder("testfolder").file('test.txt', '啦啦啦啦啦啦');
zip.generateAsync({ type: "blob" }).then(function (content) {
    FileSaver.saveAs(content, "images.zip");
});

        最后试着创建有规律的压缩包:使用jszip创建一个名为image.zip的压缩包,其中包含五个文件夹,每个文件夹包含20个文本文档,每个文本文档的名称是各自的序号,文档内容是各自的文件名去掉后缀,文件夹的名称是各自包含的起止文件序号,例如在名为1-20的文件夹中包含1.txt、2.txt、3.txt……20.txt

for (let i = 0; i < 5; i++) {
    let begin = i * 20 + 1;
    let end = (i + 1) * 20;
    let img = zip.folder("photos" + begin + "-" + end);
    for (let j = 0; j < 20; j++) {
        img.file(i * 20 + j + '.txt', i * 20 + j + '');
    }
}
zip.generateAsync({ type: "blob" }).then(function (content) {
    FileSaver.saveAs(content, "images.zip");
});

三、实现导出图片zip

1、获取图片url

目前只遇到过两种情况:

  • 通过dom获取,例如 卡片+多选按钮组 方式的展示形式,勾选导出,此时可根据dom获取url;
  • 通过接口获取;

总之能拿到有效url即可。

downLoad(amount) {
  let url2 = ''; // 照片
  let self = this;
    Axios.get(url2)
      .then((res) => {
        let arr = [];
        for (let i = 0, len1 = res.data.length; i < len1; i++) {
          if (res.data[i].pictureUrl !== '') {
            arr.push(res.data[i])
          }
        }
        let result = [];
        for (let i = 0, len2 = arr.length; i < len2; i += 20) {
          result.push(arr.slice(i, i + 20));
        }
        self.packageImages(result)
      })
      .catch((err) => {
        console.log(err);
      })
}

 2、判断图片地址是否有效

        只下载有效图片,所以需要验证图片是否有效:大小不应为0,宽高不应为0。

async validateImage(pathImg) { // 验证图片地址是否有效
  var ImgObj = new Image();
  ImgObj.src = pathImg;
  return ImgObj.fileSize > 0 || (ImgObj.width > 0 && ImgObj.height > 0);
}

3、图片转base64

需要转为base64,以供后续保存图片。

getBase64(img) {
  function getBase64Image(img, width, height) {
 // width、height调用时传入具体像素值,控制大小 ,不传则默认图像大小
    let canvas = document.createElement("canvas");
    canvas.width = width || img.width;
    canvas.height = height || img.height;

    let ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
    let dataURL = canvas.toDataURL();
    return dataURL;
  }

  let image = new Image();
  image.crossOrigin = 'Anonymous';
  image.src = img;
  let deferred = $.Deferred();
  if (img) {
    image.onload = function () {
      deferred.resolve(getBase64Image(image));
    };
    return deferred.promise();
  }
}

4、打包下载

        这里是每20张图片分一个目录,如果不需要分目录就不用将得到的图片拆成二维数组,直接打包就好。

packageImages(arr, index) {
  let self = this;
  let imgs = [];
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i].length; j++) {
      if (!arr[i][j].pictureUrl.match('base64,')) {
        imgs.push(arr[i][j]);
      }
    }
  }
  let imgBase64 = [];
  let imgsName = [];
  let imageSuffix = [];// 图片后缀
  let zip = new JSZip();
  for (let j = 0; j < imgs.length; j++) {
    let suffix = ".jpg";
    imageSuffix.push(suffix);
    this.getBase64(imgs[j].pictureUrl)
      .then(function (base64) {
        imgBase64.push(base64.substring(22));
        let fileName = imgs[j].cardId;
        imgsName.push(fileName);
      }, function (err) {
        console.log(err);
      });
  }

  function tt() {
    setTimeout(function () {
      if (imgs.length === imgBase64.length) {
        for (let i = 0; i < arr.length; i++) {
          let begin = i * 20 + 1;
          let end = 0;
          if (arr[i].length < 20) {
            end = imgsName.length;
          } else {
            end = (i + 1) * 20
          }
          let img = zip.folder("photos" + begin + "-" + end);
          for (let j = 0; j < arr[i].length; j++) {
            img.file(imgsName[i * 20 + j].trim() + imageSuffix[i * 20 + j], imgBase64[i * 20 + j], {base64: true});
          }
        }
        zip.generateAsync({type: "blob"}).then(function(content) {
          FileSaver.saveAs(content, "images.zip");
        });
      } else {
        tt();
      }
    }, 100);
  }

  tt();
}

数据太多时下载时间很长,那页面等待时间也会很长,可以加上进度条,每20个打个包下载一个zip,更新进度条。

总结

        本篇实践了jszip的压缩与解压缩,使用jszip和file-saver新建了包含文本文档、图片、文件夹的压缩包,实现了分段打包。共勉!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue前端下载——jszip压缩和解压,结合file-saver导出图片zip,每20个图片分一个目录 的相关文章

  • 将 Javascript 对象的属性从 string 更改为 int

    我有一个对象数组 每个对象具有三个属性 年份 总计 人均 例子 0 Object per capita 125 8 total 1007 2 year 2009 这些属性是字符串 我想创建一个循环来遍历数组并将它们转换为 int 我尝试了以
  • 在 HTML5 Javascript 中将 BlobBuilder 转换为字符串

    function blobToString blob var reader new FileReader var d reader onloadend function d callback reader result console lo
  • 使用本地存储在从另一个表保存的 HTML TABLE 中打印 JSON,以便我在另一个页面上打印我的表

    在我的作业中 我必须使用用户输入中的数据并将数据保存在本地存储中 我必须以水平表格式将这些数据从本地存储打印到其他页面 为此 我编写了用于用户输入并将数据保存在本地存储中的代码 div p p div
  • 显示具有多个父代的 D3 树

    我目前有this http bl ocks org mbostock 4339083图已实现 我希望在描述具有多个父节点的子节点时保持结构和可折叠性 有没有办法做到这一点 我研究了力图 但我也想保留一组层次结构 这意味着 1 级的父级可以有
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • 使用 Angular 指令禁用文本选择

    我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • 使用 Enzyme 测试 `React.createRef` api

    我想测试下面的类 它使用React createRef api 不过 快速搜索并没有发现任何这样做的例子 有人成功过吗 我该如何嘲笑裁判 理想情况下我想使用shallow class Main extends React Component
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容

随机推荐

  • 怎么更改dns_ESHOP连不上?SWITCH最新实用DNS地址分享

    虽然任天堂Switch采用的是不锁区的方式 但是由于各种虚拟墙的存在已经网络延迟等问题 经常导致玩家连不上eshop 买不了游戏 更新个游戏显示都要好几万小时 当然这个可以使用各种加速器等方式来解决 但是好的加速器需要付费 免费的又会经常抽
  • Receive port always be disabled.

    I configured a receive port in FILE to a local folder Biztalk administration console keep show that port is disables I f
  • 支付宝个人收款解决方案之支付宝签约方案

    关键词 签约支付 签约收款 支付宝收款 个人签约收款 背景 有做网赚或者在网上售卖个人小产品小服务的 需要进行收款 如果零星个别的收款可能直接走个人转账然后手动发货即可 但是一旦流程标准下来 量走起来之后 付款发货就需要自动化了 以提高人效
  • TCP实现socket通信(python)

    socket简介 UDP实现socket通信 python TCP实现socket通信 python 1 套接字工作流程 服务器端先初始化Socket 建立一个套接字 与端口绑定 bind 用 bind 函数来绑定一个端口号和 IP 地址
  • Java开发中的23种设计模式详解

    设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可
  • Hibernate Validator的使用以及自定义

    Hibernate Validator的英文官方文档 https hibernate org validator documentation Hibernate Validator的作用 Hibernate Validator是一个校验框架
  • Java五子棋的实现(附源码)

    学习目的 熟悉java中swing类与java基础知识的巩固 文末有源代码文件和打包的jar文件 效果图 思路 1 首先构建一个Frame框架 来设置菜单选项与按钮点击事件 MyFrame java文件代码如下 package StartG
  • http传输字符编码与转义(深度好文)

    一 引言 最近陆陆续续看了好多关于字节 字符 字符编码 字符转义的文章 终于对这个过程有了比较清晰深刻的认识 和后台开发相结合知道了乱码出现的理论具体原因 和前台开发结合知道了get与post请求的过程 这里分析下供大家学习分享 字符转义指
  • centos7离线安装sql server2019

    关闭SELINUX root localhost sed i SELINUX s enforcing disabled g etc selinux config setenforce 0 上传rpm包和依赖包 下载地址 https pkgs
  • SQL create file遇到操作系统错误5拒绝访问

    客户操作系统重新安装之后 也重新安装的了SQL Server2008R2 但是附加原来的数据的时候出现下面的错 尝试打开或创建物理文件 E liudaxitong D Data MDF 时 CREATE FILE 遇到操作系统错误 5 拒绝
  • kubernetes Service(SVC)几种4层代理的不同用法,ClusterIP、Headless、NodePort、LoadBalancer

    kubernetes Service SVC 个人学习记录 kubernetes Service SVC service 概念 service 类型 SVC 访问流程组件 VIP 和 Service 代理 代理模式分类 userspace
  • 怎么用Python设置Tkinter(TK)窗口屏幕居中且获得/设置Tkinter窗口的标题

    要修改窗口位置和修改窗口大小 要用到是tk对象提供的geometry方法 该方法的用法是geometry 字符串 这个字符串格式为 窗口宽x窗口高 窗口位于屏幕x轴 窗口位于屏幕y轴 可以只设置窗口大小或者是只设置窗口的x轴和y轴 例如ge
  • 《百万在线 大型游戏服务端开发》前两章概念笔记

    第1章 从角色走路说起 游戏网络通信的流程则是服务端先开启监听 等待客户端的连接 然后交互操作 最后断开 套接字 每个Socket都包含网络连接中一端的信息 每个客户端需要一个Socket结构 服务端则需要N 1个Socket结构 其中N为
  • MySQL数据库表的合并及分区

    今天我们来聊聊处理大数据时Mysql的存储优化 当数据达到一定量时 一般的存储方式就无法解决高并发问题了 最直接的MySQL优化就是分区分表 以下是我个人对分区分表的笔记 1 合并表 把多个结果相同的的表合并为一个容器 容器的类型 Myis
  • 欢聚集团 -- 前端二面

    面试形式 牛客网 电话面试 30多分钟 我二面进行两次 第一次二面自我介绍完 输出等腰三角形代码还没写完牛客网面试页面就死掉了 第一次二面就这样结束了 第二次二面牛客网还是不行就直接电话面试了 面试内容 用JS在控制台输出由 构成的等腰三角
  • Harbor仓库自启动设置

    1 配置文件 cd etc systemd system vi harbor service Unit Description Harbor After docker service systemd networkd service sys
  • Java搭建区块链

    前言 为了更好的理解区块链的底层实现原理 决定自己动手模拟实现一条区块链 思路分析 通过之前的学习 从文本知识的角度 我们知道 创世区块 记账原理 挖矿原理 工作量证明 共识机制等等区块链的相关知识 创建一条区块链 首先默认构造创世区块 在
  • 【Vue介绍】

    Vue js是一套构建用户界面的渐进式框架 Vue 只关注视图层 采用自底向上增量开发的设计 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件 Vue js 使用了基于 HTML 的模板语法 允许声明式地将 DO
  • 通过方法引用获取方法名

    在学习Mybatis plus时 可以通过getter方法的方法引用来获取到对应的字段名 LambdaQueryWrapper
  • vue前端下载——jszip压缩和解压,结合file-saver导出图片zip,每20个图片分一个目录

    使用jszip和file saver导出图片 并打包为zip import JSZip from jszip import FileSaver from file saver 一 jszip解压缩 使用loadAsync zipFile为压