解压缩文件

我想使用Web浏览器在客户端显示OpenOffice文件,.odt和.odp文件。

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

我该怎么做?

我写了一个JavaScript解压器。 有用。

它依赖于Andy GP Na的二进制文件阅读器和一些RFC1951从notmasteryet中扩充逻辑 。 我添加了ZipFile类。

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

来源:
http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip (无效链接)

注意 :链接已经死了。 我很快就会find一个新的主机。

在源代码中包含一个ZipFile.htm演示页面和3个不同的脚本,一个用于zipfile类,一个用于膨胀类,另一个用于二进制文件读取器类。 演示还依赖于jQuery和jQuery UI。 如果你只是下载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文件。 有一个asynchronous的callback,当读取完成时(通常发生在合理大小的zips不到一秒钟) – 在这个演示中,callback保存在doneReading局部variables中,该variables只是简单地调用extractEntries ,只是盲目地解压所有的内容提供的zip文件。 在一个真正的应用程序,你可能会select一些条目提取(允许用户select,或select一个或多个条目编程等)。

extractEntries fn遍历所有条目,并在每个条目上调用extract() ,传递一个callback。 一个条目的解压缩需要时间,对于zipfile中的每个条目来说可能是1秒或更多,这意味着不同步是合适的。 抽取callback只是将提取的内容添加到页面上的jQuery手风琴。 如果内容是二进制的,则它被格式化(未示出)。


它有效,但我认为效用有限。

首先,它非常缓慢。 需要约4秒钟从PKWare解压缩140k AppNote.txt文件。 在.NET程序中,可以在小于.5s内完成相同的解压缩。 编辑 :JavaScript ZipFile解包比现在更​​快,在IE9和Chrome。 它比编译的程序还要慢,但是对于正常的浏览器使用来说,这是很快的。

另一个:它不会stream式传输。 它基本上将zip文件的全部内容淹没在内存中。 在“真正的”编程环境中,只能读取zip文件的元数据(比如,每个条目64字节),然后根据需要读取和解压缩其他数据。 在JavaScript中没有办法像IO这样做,据我所知,因此唯一的select是将整个zip文件读入内存,并在其中进行随机访问。 这意味着它将对大型zip文件的系统内存提出不合理的要求。 对于较小的zip文件来说,这不是一个问题。

另外:它不处理“一般情况下”的压缩文件 – 有很多的zip选项,我没有打开在unzipper实现 – 如ZIPencryption,WinZipencryption,zip64, UTF-8编码的文件名等上。 ( 编辑 – 它现在处理UTF-8编码的文件名)。 虽然,ZipFile类处理基础知识。 其中有些东西不难实现。 我有一个 JavaScript 的AESencryption类 ; 这可以被整合来支持encryption。 对于大多数Javascript用户来说,支持Zip64可能是没用的,因为它支持> 4GB的zip文件 – 不需要在浏览器中提取这些文件。

我也没有testing解压缩二进制内容的情况。 现在它解压缩文本。 如果你有一个压缩的二进制文件,你需要编辑ZipFile类来正确处理它。 我没有弄清楚如何做到这一点。 它现在也执行二进制文件。


编辑 – 我更新了JS解压缩库和演示。 它现在除了文本外还有二进制文件。 我已经使它更具弹性,更通用 – 你现在可以指定读取文本文件时使用的编码。 此外演示扩展 – 它显示在浏览器中解压缩XLSX文件,等等。

所以,虽然我认为它的效用和兴趣是有限的,但它是有效的。 我想这会在Node.js工作。

我使用zip.js ,它似乎是相当有用的。 值得一看!

例如,查看解压缩演示 。

我发现jszip相当有用。 我迄今为止只用于阅读,但也具有创build/编辑function。

明智的代码看起来像这样

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

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

代码示例在作者网站上给出 。 您可以使用babelfish翻译文本(日文到英文)。

据我了解日本,这个zip膨胀代码是为了解码ZIP数据(stream)而不是ZIP存档。

我写了“JavaScript的二进制工具”,一个开源项目,包括解压,unrar和untar的能力: https : //github.com/codedread/bitjs

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

HTH!