`
xhload3d
  • 浏览: 200914 次
社区版块
存档分类
最新评论

Zip 压缩、解压技术在 HTML5 浏览器中的应用

阅读更多

JSZip 是一款可以创建、读取、修改 .zip 文件的 javaScript 工具。在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这时候只需要做一次请求,这样既减少了服务器的压力,同时也可以加快 web 应用的呈现速度。

 

今天就来探讨下 JSZip 如何与 HT 拓扑应用结合。先来看看这期 Demo 的效果图:


第一步、需要将应用对相关资源打包成 .zip 文件,



 这是我要压缩的文件列表,把响应的资源文件存放到对应的文件夹下,然后在 loadorder 文件中标明资源加载的顺序,loadorder 文件内容如下:

'js/ht.js',
'js/ht-obj.js',
'js/ht-modeling.js',
'obj/equipment.mtl',
'obj/equipment.obj',
'image/equipment.jpg'

在资源加载顺序中,要标明响应资源的相对于 .zip 文件的路径,这样方便在读取 .zip 文件时快速找到相应的资源文件。

第二步、在 html 文件中引入 JSZip 和 JSZipUtils 库,接下来就是请求 .zip 文件,并对 .zip 文件做解析处理。

JSZipUtils.getBinaryContent('res/ImportObj.zip', function(err, data) {
    if(err) {
        throw err; // or handle err
    }
    var zip = new JSZip(data);

    var loadorderStr = zip.file('loadorder').asText(),
            order;
    eval('order = [' + loadorderStr + ']');
    var len = order.length,
            image = {},
            mtlStr = '',
            objStr = '';
    for(var i = 0; i < len; i++) {
        var fileName = order[i];
        if(fileName.indexOf('js/') >= 0) {
            var js = document.createElement('script');
            js.innerHTML = zip.file(fileName).asText();
            document.getElementsByTagName('head')[0].appendChild(js);
        } else if(fileName.indexOf('image/') >= 0) {
            var buffer = zip.file(fileName).asArrayBuffer(),
                    str = _arrayBufferToBase64(buffer),
                    pIndex = fileName.indexOf('.'),
                    type = fileName.substr(pIndex + 1),
                    re = 'data:image/' + type + ';base64,';

            image[fileName] = re + str;
        } else if(fileName.indexOf('obj/') >= 0) {
            var str = zip.file(fileName).asText();
            if(fileName.indexOf('.mtl') > 0) {
                mtlStr = str;
            } else if(fileName.indexOf('.obj') > 0) {
                objStr = str;
            }
        }
    }

    init(objStr, mtlStr, image);
});

首先通过 JSZipUtils 获取 .zip 文件,将获取到的文件内容通过 new JSZip(data) 方法加载到 zip 变量中,通过 zip.file(fileName) 读取 loadorder 文件内容,试用 eval 命令动态执行脚本,将文本内容转换为 js 变量 order,最后通过遍历 order 变量,将 js 资源动态引入到页面中。

 

在 .zip 文件中有包含图片文件,JSZip 只能获取到图片文件的 ArrayBuffer 数据,这时需要将 ArrayBuffer 转换为 Base64 才能够为浏览器所识别,所以这里定义了一个转换函数:_arrayBufferToBase64 

function _arrayBufferToBase64( buffer ) {
    var binary = '';
    var bytes = new Uint8Array( buffer );
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) {
        binary += String.fromCharCode( bytes[ i ] );
    }
    return window.btoa( binary );
}

这次的案例中,有涉及到 3D 模型数据与 HT 3D 拓扑应用的结合,在 .zip 文件中的 obj 目录就是存放 3D 模型数据,在文件读取中,将 3D 模型数据以文本对形势读取出来存放到变量中,再将数据传递到 init 函数中,通过 ht.Default.parseObj() 方法将 3D 模型数据加载到 HT 中。

function init(objStr, mtlStr, image) {
    dataModel = new ht.DataModel();
    g3d = new ht.graph3d.Graph3dView(dataModel);

    view = g3d.getView();
    view.className = 'main';
    document.body.appendChild(view);
    window.addEventListener('resize', function (e) {
        g3d.invalidate();
    }, false);

    g3d.setEye([0, 500, 1000]);
    g3d.setCenter([0, 200, 0]);
    g3d.setGridVisible(true);
    g3d.setGridColor('#74AADA');

    var param = {
        shape3d: 'E1',
        center: true,
        cube: true
    };

    var modelMap = ht.Default.parseObj(objStr, mtlStr, param);
    for(var model in modelMap) {
        var map = modelMap[model],
                i = map.image,
                index = i.lastIndexOf('/'),
                fileName = i.substr(index + 1),
                rawS3 = map.rawS3;
        for(var imgName in image) {
            if(imgName.indexOf(fileName) >= 0) {
                ht.Default.setImage(i, 256, 256, image[imgName]);
            }
        }
    }

    var node = new ht.Node();
    node.s({
        'shape3d': 'E1',
        'wf.visible': 'selected',
        'wf.width': 3,
        'wf.color': '#F7F691'
    });
    node.s3(param.rawS3);
    node.p3(0, param.rawS3[1]/2, 0);
    dataModel.add(node);
}

上述是生成 3D 拓扑、3D 模型引入和引用 3D 模型创建拓扑节点的代码。其中那段 setImage 的代码需要特别注意,为什么我要大费周张的去判断 image 的文件名呢,那是因为在 mtl 3D 模型描述文件中有一个设置贴图的属性,该属性可以指定文件的绝对路径,也可以指定文件的相对路径,因为采用 JSZip 无法将 .zip 中的文件内容写回到本地目录中,所以只能将贴图属性对应的属性名称作为 HT 中的 image 名称设置到 HT 中,以便 HT 模型加载的时候能够获取得到模型所需要的图片资源。HT 3D 拓扑的应用可以参考《3D拓扑自动布局之Node.js篇》。

 

JSZip 在压缩或解压数据的时候,如果出现速度较慢的情况,可以考虑使用 Web Worker,Web Worker的具体应用可以参考《3D拓扑自动布局之Web Workers篇》。

 

  • 大小: 283.5 KB
  • 大小: 66.7 KB
2
1
分享到:
评论

相关推荐

    ES文件浏览器插件p7za_arm_pie安卓版android解压缩p7za,7z,7zip,rar解压插件ES文件管理器

    ES文件浏览器插件p7za_arm_pie安卓版android解压缩p7za,7z,7zip,rar解压插件ES文件管理器,安装后就可以用ES文件浏览器解压7z,rar等格式的压缩文件了

    Java实现将多目录多层级文件打成ZIP包,以及解压ZIP包

    包含了使用的jar包,以及一个Java类,实现了使用Java对多目录多层级的文件进行打包,以及对ZIP包进行解压缩的操作。

    UC 浏览器阅读插件1.1.9_0.zip

    UC扩展中心无法访问,新做的系统,最可惜的是UC浏览器中的阅读插件。...使用方法:(360极速浏览器我已安装成功)将压缩文件解压,在Chrome浏览器扩展程序中点“加载已解压的扩展程序”,选择解压的文件夹就可以。

    ES 文件浏览器 ES File Explorer 4.2.4.5 中文免费版.zip

    ES 文件浏览器是一款多功能的手机文件/程序/进程管理器,可以在手机、电脑、远程和蓝牙间浏览管理文件。是一个功能强大的免费的本地和网络文件管理器和应用程序管理器。适用2.0以上Android机型。ES文件浏览器是一个...

    阿香婆出品压缩文档管理工具 Ashampoo ZIP Pro 3.0.26 中文多语免费.zip

    Ashampoo ZIP Pro 是一款由著名的 Ashampoo(阿香婆)公司开发的一款文档压缩管理工具。Ashampoo ZIP Pro 让你不用再烦恼各种格式的支持!ZIP、RAR、TAR、CAB 等等 – Ashampoo ZIP 都能快速可靠的打开,还会自动...

    JSONC, JSON压缩器和解压缩器.zip

    JSONC, JSON压缩器和解压缩器 JSONC 版本更新到版本 变更日志文件背景使用Javascript开发富internet应用程序( RIA )的一个问题是传输到服务器和从服务器传输的数据量。 当数据来自服务器时,这个数据可能被压缩,...

    Ashampoo ZIP Pro 3(阿香婆解压缩软件)官方中文版V3.05.15

    完美兼容多核处理器并拥有解压缩软件领域中最快的ZIP/ZIPX引擎,创建和加密文件(256位加密)速度极快,保证档案安全,阿香婆压缩软件内置的文件浏览器除了常规的压缩功能外,ashampoo zip pro还支持分屏视图等解...

    【.Net 】Zip操作库

    - 一个Windows窗体应用程序,创建的归档内容的隐私AES加密ZIP压缩文件。 - 在PowerShell的脚本或VBScript行政执行备份和归档。 - WCF服务,它接收一个zip文件作为附件,并动态的zip解压缩到一个流分析 - 一个老派...

    《点燃我温暖你》爱心代码.zip

    《点燃我温暖你》爱心代码.zip保姆级教程:解压下载的压缩包浏览器打开hearts.html即可查看效果 ##介绍 点燃我温暖你&gt;&gt;:李询 小红书的集美们,你们要的代码来了。《点燃我温暖你》爱心代码.zip保姆级教程:解压下载...

    xzwasm:通过 WebAssembly 为浏览器解压 XZ

    XZ(或者更确切地说,底层的 LZMA2 算法)不是那么面向文本内容,并且 - 在我的实验中 - 通常比 Brotli 更好地压缩位代码(例如,WebAssembly .wasm文件、.NET .dll文件) 例如,在每种情况下都使用

    SingleFileZ:适用于Firefox的Web扩展Chrome浏览器边缘和CLI工具,可将整个网页的真实副本保存在自解压HTMLZIP多语言文件中

    可以在文件系统上解压缩此ZIP文件,例如,以便在不支持使用SingleFileZ保存的页面的浏览器中查看页面。 演示版 例子 这是SingleFileZ生成的页面示例: ://gildas-lormeau.github.io。 这是相同的示例,但是受密码...

    Ashampoo Zip Pro v1.0.5.zip

    Ashampoo Zip Pro兼容绝大多数流行的压缩格式,轻松打开朋友、同事发来的所有文件。 Ashampoo Zip Pro功能: 轻松打开常用格式 全面支持 Windows 7/8 Windows 资源管理器集成 分割压缩文档 支持访问由 VSS ...

    opencsv-2.3.jar中文-英文对照文档.zip

    解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。...

    Alook浏览器安卓版 v8.0.0 支持视频播放16倍速的浏览器

    解压和压缩(zip, rar 和 7z),支持加密解压和压缩,新建/编辑文件,纯文本方式打开文件,文件选择编码,从相册导入视频和图片,移动和复制文件,Wi-Fi传输…全格式电子书阅读器(txt, pdf, epub, kindle, mobi, azw,...

    Nginx服务器中的GZip配置参数详解

    gzip(GUN-ZIP)是一种压缩技术,经过gzip压缩后的页面大小可以变成原来的30%或者更小。 用户浏览页面的时候速度也会更快,gzip的压缩页面需要服务端于浏览器同时支持,服务端压缩传到 浏览器进行解压并解析,现在大多数的...

    基于浏览器的简易资源管理器(源码)

    基于浏览器的简易资源管理器(源码) 制作的初衷是没有FTP的情况下能够...全Ajax实现,支持文件浏览、新建编辑文件(夹)、删除移动重命名文件、压缩解压zip文件、文件上传下载等。 基本支持IE5.5以上、FF、Opera浏览器。

    WebExplorer - 基于浏览器的资源管理器

    WebExplorer - 基于浏览器的资源管理器 全Ajax实现,支持文件浏览、新建编辑文件(夹)、删除移动重命名文件、压缩解压zip文件、文件上传下载等。 基本支持IE5.5以上、FF、Opera浏览器。

    php在线解压

    现在不少人使用免费空间,可是上传速度很不给力,想上传一个压缩文件在解压出来,但是那个是收费服务器才有的功能,o(︶︿︶)o 唉!是不是很头疼?试试用一下在线解压工具吧!即使是免费主机也有付费主机才有的在线...

    看图神器蜂蜜浏览器Honeyview.rar

    Honeyview 是来自韩国Bandisoft公司开发的一款短小精悍的轻量级电脑版图片查看器软件(优秀的解压缩软件Bandizip也是该公司的力作),中文名叫蜂蜜浏览器,全面兼容BMP、JPG、GIF、PNG、DNG、CR2、CRW、WebP、GIF、...

    qiniu-java-sdk-7.1.3-API文档-中英对照版.zip

    使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

Global site tag (gtag.js) - Google Analytics