题
我要显示 开发办公室 使用 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的工作。
其他提示
我发现 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模块