暂时解压缩文件以查看浏览器中的内容

时间:2016-05-06 14:58:46

标签: javascript jquery html iframe jszip

我想解压缩包含html页面,css和js目录的文件。我想暂时解压缩并在iFrame中查看html,最好是。我正在使用正在运行的jszip。我加载了html,但如何将图像,js和css文件夹添加到iFrame中?

这是我到目前为止所拥有的......

<div id="jszip_utils"></div>
<iframe id="iframe"></iframe>
<script type="text/javascript">
    function showError(elt, err) {
        elt.innerHTML = "<p class='alert alert-danger'>" + err + "</p>";
    }
    function showContent(elt, content) {
        elt.innerHTML = "<p class='alert alert-success'>loaded !<br/>" +
          "Content = " + content + "</p>";
    }
    var htmltext = JSZipUtils.getBinaryContent("/zip/myWebsite.zip", function (err, data) {
        var elt = document.getElementById('jszip_utils');
        if (err) {
            showError(elt, err);
            return;
        }
        try {
            JSZip.loadAsync(data)
                .then(function (zip) {
                    for(var name in zip.files) {
                        if (name.substring(name.lastIndexOf('.') + 1) === "html") {
                            return zip.file(name).async("string");
                        }
                    }
                    return zip.file("").async("string");
                })
                .then(function success(text) {
                    $('#iframe').contents().find('html').html(text);
                    showContent(elt, text);
                }, function error(e) {
                    showError(elt, e);
                });
        } catch(e) {
            showError(elt, e);
        }
    });
</script>

这会得到html,但是js css和图像文件没有显示出来。我相信我需要做一些假路由,但我不确定我怎么能这样做。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

如果zip中的html / js不是太复杂,例如一个有部分路径的AngularJS应用程序,这是可能的。

诀窍是用以下任一项替换指向zip文件的css,js,img src / href url:

  • Object Url:URL.createObjectURL(Blob或File对象);
  • Data Urldata:[<mediatype>][;base64],<data>
  • 或者在js和css的情况下将内容直接注入适当的元素

替换src / href引用后,只需将新的html注入iframe。

第1步:解析html以便操作它

//html from a call like zip.file("index.html").async("string")
let parser = new DOMParser;
let doc = parser.parseFromString(html,"text/html");

步骤2:查找具有相对路径的所有元素(例如 /imgs/img.jpg ),因为它们更容易处理,因为您可以将该路径用于zip.file

//Simply finds all resource elements, then filters all that dont start with '/'
var elements = jQuery("link[href],script[src],img[src]",doc).filter(function(){
   return /^\//.test(this.href || this.src);
});

步骤3:将src,href替换为对象url,数据url或直接内容

//assume element is the html element: <script src="/js/main.js"></script>
zip.file(element.src).async("string").then(jsText=>{
   element.src = "data:text/javascript,"+encodeURIComponent(jsText);
});

第4步:获取新的html文本并将其注入iframe

let newHTML = doc.documentElement.outerHTML;
var viewer = document.querySelector('#iframeID');
viewer = viewer.contentWindow || viewer.contentDocument.document || viewer.contentDocument;

viewer.document.open();
viewer.document.write(html);
viewer.document.close();

JSFiddle Demo - 演示替换src / href网址

作为安全说明,如果您使用的是不知道其内容的zip文件,则应在受保护的iframe中运行整个应用