• js 前端下载文件并压缩保存到本地


    第一步下载包

    npm i jszip save-as-file -S
    
    • 1

    第二步引入包

    import JSZip from "jszip";
    import saveFile from "save-as-file";
    
    • 1
    • 2

    第三步使用

    
    const zip = new JSZip();
    const cache = {};
    const promises = [];
    batchDownLoadZip(
      [
        "http://xxx.jpg",
        "http://xxx.png",
      ],
      "压缩文件名称"
    );
    function batchDownLoadZip(fileList, zipName) {
      return new Promise((resolve, reject) => {
        fileList.forEach((item, index) => {
          // item.fileUrl.split('?')[0] 处理fileList里的url地址 去除?号和后面的字符串
          const promise = getImgArrayBuffer(item.split("?")[0])
            .then((data) => {
              // 下载文件, 并存成ArrayBuffer对象
              // item.fileName fileList里的文件名
              zip.file(index + ".png", data, { binary: true }); // 逐个添加文件
              cache[item.fileName] = data; // 可要可不要 用来打印查检查添加了那些文件
            })
            .catch((e) => {
              console.log("文件访问失败");
            });
          promises.push(promise); // 加到promises队列里
        });
        Promise.all(promises)
          .then(() => {
            // 异步队列全部完成时 执行下面代码
            console.log("开始压缩");
            zip
              .generateAsync({ type: "blob" })
              .then((content) => {
                // 生成二进制流
                console.log("压缩成功", content);
                saveFile(content, zipName);
                console.log("文件保存成功");
                resolve();
              })
              .catch((e) => {
                console.log("下载失败");
                reject(e);
              });
          })
          .catch((e) => {
            console.log("压缩失败");
            reject(e);
          });
      });
    }
    function getImgArrayBuffer(href) {
      return new Promise((resolve, reject) => {
        // 通过请求获取文件blob格式
        const xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", href, true);
        xmlhttp.responseType = "blob";
        xmlhttp.onload = function() {
          if (this.status === 200) {
            resolve(this.response);
          } else {
            reject(this.status);
          }
        };
        xmlhttp.send();
      });
    }
        
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
  • 相关阅读:
    selenium 对当前已经打开的窗口进行调试
    Nginx架构基础
    【VSCode 插件商城无法搜索到插件的解决方法】
    Kubernetes v1.24 基于containerd部署
    亚马逊云科技数据分析为这伴科技赋能,实现“零”中断目标
    岁月
    如何做出有价值的知识管理文档?
    ElasticSearch中文分词
    44.(前端)修改菜单路由地址
    数据结构哈希表(散列)Hash,手写实现(图文推导)
  • 原文地址:https://blog.csdn.net/qq_38299934/article/details/134037619