JSZIP+StreamSaver下载大文件打包遇到的问题

背景:公司项目为了节约服务器硬盘,需要从微信企业微盘下载大批量文件,然后,进行客户端打包.

问题:

根据StreamSaver的代码演示例子,是通过指定Blob类型进行流下载更新,我尝试了这个方法,发现一旦Blob类型大于1G的时候,Chrome浏览器便会抛出Type Error:network error.无法进行下载.也就是说当文件批量下载缓存到内存中后,JSZIP工作正常,可以进行压缩,但是,一旦执行reader.read()方法便会抛出异常.

解决:更换成uint8array编码之后,问题解决,即便打包2G甚至更大的文件也不会出现错误.     

原因:由于blob类型在浏览器中是存在大小限制的.Chrome's Blob Storage System Design (googlesource.com) 具体可以查看这篇,而为什么uint8array比blob可以存储的更多,只能去找源码了,我猜测可能的原因是对uint8array做了一定优化

总结:其原因在于由于示例代码的误导,走了不少弯路   

  Promise.all(promises).then(() => {


                zip.generateAsync({
                    type: 'uint8array',
                    streamFiles: true,
                    compression: 'DEFLATE',
                    compressionOptions: {
                        level: 9
                    }
                }, function updateCallback(metadata) {

                    let v = metadata.percent.toFixed(0);
                    $("#progressbar_id").attr("aria-valuenow", v);

                }).then(content => {

                    let max = content.length;

                    window.fileStream = streamSaver.createWriteStream(filename + '.zip', {
                        size: max
                    });
                    window.writer = fileStream.getWriter();
                    window.onunload = () => writer.abort();

                    writer.write(content).then(function () {
                        writer.close();
                        window.onunload = null;
                        window.writer = null;
                        window.fileStream = null;
                        content = null;
                    });

                });
            }).catch(res => {
                console.log("压缩失败");
            });

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值