热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求解!小弟向使用过前端压缩工具JSZip!求助!

1、事情是这样的:我们需要在客户端在上传他自己的文件的时候进行一下压缩,这个压缩工作是在客户端进行的,目的是节省服务端的计算资源和存储空

  1. 1、事情是这样的:我们需要在客户端在上传他自己的文件的时候进行一下压缩,这个压缩工作是在客户端进行的,目的是节省服务端的计算资源和存储空间。


  2. 2、然后我们选择了github上的工具:JSZip


  3. 3、在实际使用的过程中,我们遇到了这样的场景:用户需要同时上传多个文件,(文件类型不确定),当上传多个文件的时候会频繁出现这样的bug前端

    1
    html

    上的

    1
    input file

    设置

    1
    multiple

    ,然后上传时选择多个文件,执行上传程序,并将文件压缩到zip包中时,会发现zip中少了一些文件(并不是总这样,跟文件大小和数量好像也没有直接关系,亲自测试过)另一个bug是:上传文件后,如果想再压缩另一个zip,必须刷新一下当前页面,否则,前一次选择的文件也会被压入到这次的zip当中。而且刷新页面后还是会出现压缩文件缺失的情况。
    具体代码和场景我下面尽量复原:


js代码:

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
71
72
73
74
75
76
77
require('cp');

require('./style.css');// 自定义样式

const JSZip = require('jszip');

const fileSaver = require('file-saver');

const zip = new JSZip();

$(() => {

// 写入自定义的js代码

  /* 客户端

   模型压缩开始 */

  $('#testJSZip').on('click', function() {

    var fileBox = $('#testFile');

    var fileList = fileBox[0].files;

    var flag = false;

    for (var i = 0; i
      if (i === fileList.length - 1) {

        flag = true;

      }

      readFile(fileList[i], flag);

    }

  });

  function readFile(file, flag) {

    const reader = new FileReader();

    //  reader.readAsText(file);

    //  中文windows系统 txt 文本多数默认编码 gbk

    //  reader.readAsText(file, 'gbk');

    reader.readAsDataURL(file);

    reader.Onloadend= function(e) {

      var result = reader.result;

      var objName = 'example';

      //  获取obj文件的文件名

      if (file.name.indexOf('.obj') !== -1) {

        var num = file.name.indexOf('.obj');

        objName = file.name.substring(0, num);

      }

      // 如果是图片文件,需要保存的时候把base64转为Blob二进制格式

      if (file.name.indexOf('.jpg' | '.png' | '.jpeg') !== -1) {

        result = convertBase64UrlToBlob(result);

      }

      zip.file(file.name, result, {type: 'blob'});

      console.log(zip);

      //  zip.folder().forEach();

      console.log(file.name);

      if (flag) {

        zip.generateAsync({

          type: 'blob',

          compression: 'DEFLATE', //  force a compression for this file

          compressionOptions: { //  使用压缩等级,1-9级,1级压缩比最低,9级压缩比最高

            level: 6,

          },

        }).then(function(content) {

          // see FileSaver.js

          console.log('content:' + content);

          Promise.resolve(true).then(function() {

            fileSaver.saveAs(content, objName + '.zip');

          });

        });

      }

    };

  }

  /* 客户端

   模型压缩结束 */

  /**

   * 将以base64的图片url数据转换为Blob

   * @param urlData

   * 用url方式表示的base64图片数据

   */

  function convertBase64UrlToBlob(urlData) {

    var bytes = window.atob(urlData.split(',')[1]);

    //  处理异常,将ascii码小于0的转换为大于0

    var ab = new ArrayBuffer(bytes.length);

    var ia = new Uint8Array(ab);

    for (var i = 0; i
      ia[i] = bytes.charCodeAt(i);

    }

    return new Blob([ab], {type: 'image/jpg'});

  }

});

ejs代码:

1
2
3
4
5
6
7
   


       


           


           


       


       

   

选择本地文件:


点击button开始压缩:

好了这是第一次压缩:可见文件是完整的,然后我们做下面的操作,不刷新页面的前提下,再选择两个文件,执行压缩:


结果前面的结果也被压缩到文件当中去了!!(缓存问题后面会提到)
接着,我们刷新页面重新上传:就会出现有时少个文件,有时多个文件的情况,当然多文件时也是上次选择过的文件


被这个东西搞得头疼了很久了,如果有用过的,求大神帮忙解答一下,不胜感激


推荐阅读
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
益达怡君33
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有