我要显示 开发办公室 使用 Web 浏览器在客户端查看文件、.odt 和 .odp。

这些文件是压缩文件。使用 Ajax,我可以从服务器获取这些文件,但这些文件是压缩文件。我必须使用解压它们 JavaScript, ,我尝试过使用 inflate.js, http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt, ,但没有成功。

我怎样才能做到这一点?

有帮助吗?

解决方案

我在Javascript中写了unzipper。有用。

它依赖于安迪G.P.娜的二进制文件阅读器一些RFC1951充气逻辑从notmasteryet 。我添加zip文件类。

工作示例:结果 http://cheeso.members.winisp.net/Unzip-Example.htm (死链接)

源:结果 http://cheeso.members.winisp.net/srcview.aspx?dir = JS-解压(死链接)

<强> NB :链接都死了。我会很快找到新的宿主。

包括在所述源是ZipFile.htm示范页,和3个不同的脚本,一个用于压缩文件类,一个用于充气类,和一个用于二进制文件读取器类。该演示还取决于jQuery和jQuery用户界面。如果你只是下载js-zip.zip文件,所有必要的来源是存在的。


下面就是应用程序的代码看起来像在Javascript:

// In my demo, this gets attached to a click event.
// it instantiates a ZipFile, and provides a callback that is
// invoked when the zip is read.  This can take a few seconds on a
// large zip file, so it's asynchronous. 
var readFile = function(){
    $("#status").html("<br/>");
    var url= $("#urlToLoad").val();
    var doneReading = function(zip){
        extractEntries(zip);
    };

    var zipFile = new ZipFile(url, doneReading);
};


// this function extracts the entries from an instantiated zip
function extractEntries(zip){
    $('#report').accordion('destroy');

    // clear
    $("#report").html('');

    var extractCb = function(id) {
        // this callback is invoked with the entry name, and entry text
        // in my demo, the text is just injected into an accordion panel.
        return (function(entryName, entryText){
            var content = entryText.replace(new RegExp( "\\n", "g" ), "<br/>");
            $("#"+id).html(content);
            $("#status").append("extract cb, entry(" + entryName + ")  id(" + id + ")<br/>");
            $('#report').accordion('destroy');
            $('#report').accordion({collapsible:true, active:false});
        });
    }

    // for each entry in the zip, extract it. 
    for (var i=0; i<zip.entries.length;  i++) {
        var entry = zip.entries[i];

        var entryInfo = "<h4><a>" + entry.name + "</a></h4>\n<div>";

        // contrive an id for the entry, make it unique
        var randomId = "id-"+ Math.floor((Math.random() * 1000000000));

        entryInfo += "<span class='inputDiv'><h4>Content:</h4><span id='" + randomId +
            "'></span></span></div>\n";

        // insert the info for one entry as the last child within the report div
        $("#report").append(entryInfo);

        // extract asynchronously
        entry.extract(extractCb(randomId));
    }
}

在演示工作在几个步骤:readFile FN通过点击触发,实例化一个对象使用ZipFile,内容的zip文件。有对读操作完成后(通常在合理规模的拉链不到一秒钟的情况),异步回调 - 在这个演示回调在doneReading局部变量,它只是调用extractEntries举行,这 只是一味的解压所提供的zip文件中的所有内容。在实际的应用程序,你可能会选择一些条目提取物(允许用户选择,或以编程方式选择一个或多个条目,等等)。

FN迭代的所有条目,并且呼叫extractEntries上各一个,通过一个回调的extract()。条目的解压缩需要时间,也许的1或多个在压缩文件中的每个条目,这意味着异步是适当的。将提取的回调只是将所提取的内容页面上的jQuery的手风琴。如果内容是二进制的,则它被格式化为例如(未示出)。


它的工作原理,但我认为该实用程序有所限制。

<击>一两件事:这是非常缓慢的。大约需要4秒,从PKWARE解压140K APPNOTE.TXT文件。同样的解压缩可以做到小于在.NET程序,5S 修改:JavaScript的ZipFile的解压速度明显高于现在这个样子,在IE9和Chrome浏览器。它仍然是慢于编译的程序,但它是用于正常浏览器使用足够快。

有关另一:它不这样做流。它主要吸食的压缩文件到内存中的全部内容。在一个“真实”的编程环境,你可以阅读只是一个zip文件(比如说,每个条目64个字节)的元数据,然后读取并根据需要解压缩其它数据。有没有办法做到像IO在JavaScript中,据我所知,因此,唯一的选择就是读取整个压缩到内存中,并做它随机访问。这意味着它会放在系统内存不合理的要求对较大的zip文件。对于较小的zip文件没有这么多的问题。

另外:它不处理“一般情况下,” zip文件 - 有很多压缩选项,我没有理会在unzipper落实 - 像ZIP加密,加密的WinZip,ZIP64,<击> UTF- 8个编码的文件名,等。 (修改 - 它现在可以处理UTF-8编码的文件名)。 zip文件类处理的基础知识,但。对这些事情并不难实现。我有在Javascript中的AES加密类;可以纳入到支持加密。支持Zip64可能会无用的Javascript的大多数用户,因为它的目的是支持> 4GB zipfiles - 不需要提取那些在浏览器中。

<击>我还没有测试用于解压缩的二进制内容的情况下。现在它解压缩文本。如果你有一个压缩的二进制文件,你需要编辑zip文件类来妥善处理。我也没弄明白怎么做干净。 现在做的二进制文件,太。


修改 - 我更新了JS解压库和演示。现在做的二进制文件,除了文本。我将它更具弹性和一般 - 你现在可以阅读文本文件时指定要使用的编码。还演示扩展 - 它解压缩显示在浏览器中XLSX文件,等等。

所以,虽然我认为它是有限的效用和利益,它的工作原理。我想这将在Node.js的工作。

其他提示

我使用 zip.js ,它似乎是非常有用的。这是值得一试!

检查解压演示,例如

我发现 jszip 的非常有用的。我用至今只阅读,但他们已经创建/编辑功能,以及。

代码明智的,它看起来像这样

var new_zip = new JSZip();
new_zip.load(file);
new_zip.files["doc.xml"].asText() // this give you the text in the file

一两件事我注意到的是,它似乎文件必须以二进制流格式(读取使用的FileReader()的.readAsArrayBuffer,否则我得到的错误,说我可能有一个损坏的zip文件

代码示例给出对提交网站的。您可以使用 Babelfish平台翻译的文本(日英)。

据我明白日本,这个拉链充气代码旨在解码ZIP数据(流)不ZIP文件。

我写了一个类了。 HTTP://blog.another- d-mention.ro/programming/read-load-files-from-zip-in-javascript/ 您可以直接使用类的方法压缩负荷基本资产,比如JavaScript / CSS /图像。 希望它帮助

我写了“Binary Tools for JavaScript”,这是一个开源项目,其中包含解压缩、解压缩和解压的功能: https://github.com/codedread/bitjs

在我的漫画书阅读器中使用: https://github.com/codedread/kthoom (也是开源的)。

哈!

如果您需要支持其他格式,以及或者只是需要良好的性能,您可以使用此 WebAssembly库

它基于所承诺的,它使用WebWorkers为线程和API实际上是简单ES模块

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top