【发布时间】:2011-03-06 20:21:41
【问题描述】:
我需要从 javascript(实际上来自 Greasemonkey)有效地访问一个大型 gzip 压缩的 xml 文件。 不幸的是,服务器没有提供 Content-Encoding 标头,并且 Content-Type 是“application/x-gzip”,所以 firefox 不会(据我所知)自动膨胀它。 如果有办法伪造Firefox,那将是理想的。除此之外,我需要一些方法来有效地进行通货膨胀......我现在使用的东西大约需要 30 秒才能对 1.2Mb gzip 压缩文件进行放气;我想在 5 秒内完成。
(我正在处理的 Greasemonkey 脚本不能有任何其他外部服务器依赖项,因此不能选择代理和呈现 Content-Encoding 标头。)
我现在在做什么,我从几个地方拼凑起来。为了接收不受干扰的二进制数据,我使用了firefox XMLHTTPRequest overrideMimeType 扩展:
$.ajax(url, {
dataType:'text',
beforeSend:function(xhr){
xhr.overrideMimeType('text/plain; charset=x-user-defined')
},
success:function(data){
var blob='';
for (i=0; i<data.length; ++i)
blob += String.fromCharCode(data.charCodeAt(i) & 0xff);
...
然后膨胀,使用 https://github.com/dankogai/js-deflate/blob/master/rawinflate.js 的稍微修改和内联的副本(据我所知,还有其他几个 javascript 膨胀库,所有这些都基于旧库 http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt)。这是极其缓慢的部分。
// blithely assuming the gzip header won't change,
// strip a fixed number of bytes from the front
deflated=RawDeflate.inflate(blob.substring(22,blob.length-8));
然后将其弹出到一个 innerHTML 属性中以对其进行解析:
xmlcontainer=$('<div>');
// remove <?xml...> prolog
xmlcontainer.html(deflated.substring(45));
xmldoc=xmldoc.children();
(我知道使用 DOMParser 的 parseFromString 可以更正确地完成最后一点,但我还没有让它工作。)
【问题讨论】:
-
遗憾的是,似乎没有浏览器将其解压缩算法暴露给 Javascript - 我想这将是容易做到的一半,也是最有效的方法
-
这个你大概知道,但供参考stackoverflow.com/questions/294297/…
-
@Pekka,是的,我已经读过了,还有一个我现在找不到的问题,它有更多特定于 deflate 的链接。
-
@Pekka,我想浏览器开发人员可能从未想过这个想法。我的意思是,你会用它做什么? JS 不应该接触文件,如果设置正确,浏览器会自动处理其余部分。很难为像这样的异常情况做计划。
标签: javascript jquery xml gzip greasemonkey