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

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
分享到:
评论

相关推荐

    AS3.0 ZIP压缩解压

    AS3.0(ActionScript 3.0)是Adobe Flash平台上的编程语言,主要用于创建交互式内容、动画和网络应用程序。...总的来说,理解和掌握AS3.0 ZIP压缩解压的原理和实践,对于开发高效、可靠的Flash应用是至关重要的。

    PHP在线压缩解压ZIP文件

    标题"PHP在线压缩解压ZIP文件"指的是利用PHP编写的服务,用户可以在浏览器中直接操作ZIP文件,无需下载到本地。这样的功能对于那些需要在线处理大量文件,或者希望保护用户隐私的Web应用来说非常有用。 描述中的...

    unzip PHP在线解压程序 ZIP在线解压 ZIP在线解压 PHP在线压缩

    标题中的“unzip PHP在线解压程序 ZIP在线解压 ZIP在线解压 PHP在线压缩”指的是一个使用PHP语言开发的Web应用程序,它允许用户在浏览器端对ZIP格式的压缩文件进行在线解压操作。这个功能在许多场景下都非常实用,...

    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包

    `FileUtils.java`类是这个功能的具体实现,它封装了上述的压缩和解压过程,使开发者能够轻松地在代码中调用这些功能。理解并掌握这些知识,对于进行Java相关的文件操作和数据打包工作至关重要。

    映阳网络在线压缩解压ZIP文件程序.zip

    【描述】:“映阳网络在线压缩解压ZIP文件程序”是一款专为用户设计的在线工具,它提供了方便快捷的ZIP文件压缩与解压功能,无需下载安装任何软件,只需通过浏览器即可完成对ZIP格式文件的操作。这款程序旨在简化...

    技术胖浏览器收藏夹大公开.zip

    总的来说,"技术胖浏览器收藏夹大公开.zip"中可能包含的链接涵盖了前端开发的各个领域,从基础技术到高级框架,再到工具和最佳实践。通过研究这些链接,开发者可以拓宽视野,了解业界动态,提升自己的技术水平。

    flex as3zip 文件解压

    这个技术主要用于创建和管理可下载的文件包或者在应用程序内部处理数据存储。以下是关于"flex as3zip 文件解压"的相关知识点: 1. **AS3Zip库介绍**:AS3Zip是一个开源的ActionScript 3库,它允许开发者在Flex应用...

    基于PHP的HILLSPHP在线压缩解压程序(zip)源码.zip

    【标题】"基于PHP的HILLSPHP在线压缩解压程序(zip)源码.zip" 提供的是一款使用PHP实现的在线压缩与解压工具,它允许用户通过Web界面对文件进行压缩或解压缩操作,无需下载到本地再进行处理。这款程序的核心功能是...

    phpzip在线解压打包

    【描述】"网页在线解压 在线打包工具"指的是在网页环境中,用户无需下载文件到本地,即可实现文件的压缩与解压缩。这种工具的出现,简化了传统文件处理流程,用户可以直接通过浏览器完成一系列文件管理操作,降低了...

    在线ZIP解压缩网页工具 PHP

    在线ZIP解压缩网页工具是基于PHP开发的一种便捷服务,它允许用户通过网页浏览器上传ZIP文件并进行解压缩操作,无需在本地计算机上安装专门的软件。这种工具在处理大文件或远程文件时尤为方便,尤其对于那些不熟悉或...

    基于PHP的HILLS PHP在线压缩解压程序(zip).zip

    【标题】基于PHP的HILLS PHP在线压缩解压程序(zip)是用于在Web环境中处理ZIP文件的PHP脚本。这个程序允许用户通过浏览器对ZIP文件进行压缩和解压缩操作,无需下载到本地后再进行处理,大大提升了用户体验。该程序的...

    zip.js解压zip文件

    本文将深入探讨如何使用`zip.js`库来解压ZIP文件,以满足开发者在前端或Node.js环境中的各种需求。 首先,让我们了解`zip.js`的核心特性。这个库支持在浏览器和Node.js环境中运行,提供了异步和同步两种模式,以及...

    整站压缩解压

    在IT行业中,"整站压缩解压"是一个重要的概念,主要涉及到网站优化、数据传输以及存储效率提升等方面。本文将详细解析这一主题,包括压缩与解压的基本原理、常用工具和技术,以及它们在整站管理中的应用。 首先,...

    解压后拖入浏览器扩展程序使用.zip

    标题 "解压后拖入浏览器扩展程序使用.zip" 暗示了这是一个包含浏览器扩展程序的压缩文件,用户需要先解压,然后将其中的文件导入到浏览器中以使用该扩展。描述中的“拖入”进一步说明了安装过程,即用户可以直接将...

    asp在线压缩解压程序

    ASP在线压缩解压程序是一种基于Active Server Pages (ASP)技术的解决方案,用于在Web服务器上实现文件的压缩和解压功能。ASP是微软开发的一种服务器端脚本语言,主要用于动态网页的创建。在这个程序中,用户可以通过...

    zlib文件,支持ZIP压缩,解压

    在IT领域,压缩技术是数据存储和传输中的一个重要环节,其中`zlib`是一个广泛应用的开源库,专门用于数据压缩和解压缩。本篇将详细阐述`zlib`及其与ZIP压缩格式的关系,以及`zlib`提供的相关文件的功能。 `zlib`是...

    在线压缩ZIP文件程序

    在线压缩ZIP文件程序是一种便捷的工具,它允许用户在无需安装特定软件的情况下,通过网络对文件或文件夹进行压缩处理。这种技术基于云计算,利用服务器的计算能力来完成压缩任务,用户只需通过浏览器访问相关网站...

    web.html_QQ浏览器压缩包.zip

    6. **ZIP压缩格式**:这是一种常见的文件压缩格式,可以将多个文件打包成一个单一的文件,方便传输和存储。解压此文件需要相应的解压缩软件,如WinRAR或Windows自带的解压缩功能。 7. **网页调试**:对于开发人员来...

    SingleFileZ是一个Web扩展用于在自解压HTMLZIP混合文件中保存网页

    这通常通过Base64编码来实现,即将二进制ZIP数据转换为可包含在HTML中的ASCII字符串。 2. **JavaScript处理**:SingleFileZ利用JavaScript进行网页捕获和文件打包。当用户触发扩展时,JavaScript代码会遍历当前页面...

Global site tag (gtag.js) - Google Analytics