热门标签 | 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开始压缩:

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


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


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


推荐阅读
  • 根据时间更改网站背景的脚本。热!
    我在网上找到了它,并以自己的方式对其进行了自定义;作者的功劳就在那里。实际上,这是一个用于更改背景颜色的脚本,并且在我看来& ... [详细]
  • ARToolKitunity
    ARToolKit为开源的AR库,相对于高通和easyAr有几点特点:1)开源2)识别项目可以动态添加(详细在后)3)识别文件可以本地生成4)目前只能识别图片(目前为.jpg格式) ... [详细]
  • 1.数据准备#测试数组vectorc(5,34,65,36,67,3,6,43,69,59,25,785,10,11,14)vector##[1]53465366736436959 ... [详细]
  • AsyncDisplayKit2.0教程(下)
    AsyncDisplayKit2.0Tutorial:AutomaticLayout原文:AsyncDisplayKit2.0Tutorial:Automatic ... [详细]
  • 第38天:Python decimal 模块
    by程序员野客在我们开发工作中浮点类型的使用还是比较普遍的,对于一些涉及资金金额的计算更是不能有丝毫误差,Python的decimal模块为浮点型精确计算提供了支持。1简介deci ... [详细]
  • 利用ipv6技术,废旧笔记本变成server
    如果你家的路由器已经get到了ipv6地址,并且你家的电脑也获取了有效的ipv6地址,在广域网的设备可以访问到。那恭喜你,再配合我这个dd ... [详细]
  • 一、vue介绍Vue.js是一套构建用户界面(UI)的渐进式JavaScript框架,是一个轻量级MVVM(model-view-viewModel&# ... [详细]
  • SortalinkedlistinO(nlogn)timeusingconstantspacecomplexity.这道题属于人生中第一次对链表进行操作,首先,不同于C++中的st ... [详细]
  • PNG在IE6下透明问题的解决办法
    2019独角兽企业重金招聘Python工程师标准做Web开发的朋友一定都知道PNG是一个相当不错的图片格式,但是这个好的格式却在IE6时代造成了麻烦࿰ ... [详细]
  • 调用:视图调用:1@Html.DropDownListFor(tt.HrEmpGuid,ViewData[Emp] as SelectList, new {@class   ... [详细]
  • 一般的网页我的项目能够很容易的实现换肤性能,能够通过js扭转link元素中引入的css主题款式链接。然而微信小程序不能动静扭转wxss文件,所以须要其余的计划来实现。 ... [详细]
  • 首页#father{border:0pxso ... [详细]
  • 作者|相学长原文|https:github.comwuomzfxblogblobmasterthis.md日常开发中,我们经常用到this。例如用Jquery绑定事件 ... [详细]
  • js Blob对象实现文件下载功能
    2019独角兽企业重金招聘Python工程师标准jsBlob对象实现文件下载功能,可以将字符串放到文件夹里,提供下载功能。下载功能$(#down ... [详细]
  • 这两天做了一个小项目,里面有个下载进度的进度条需要制作。先看呈现的效果:点击进度,然后依次递增,直到递增到百分之百。现在把这部分代码分享下来。<!DOCTYPEhtml><html ... [详细]
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社区 版权所有