如何从javascript高效访问gzip压缩包?

时间:2011-03-06 20:21:42

标签: javascript jquery xml gzip greasemonkey

我需要从javascript(实际上来自Greasemonkey)有效地访问一个大型的gzip压缩文件。 不幸的是,服务器没有提供Content-Encoding标头,而Content-Type是“application / x-gzip”,所以firefox不会(据我所知)自动膨胀它。 如果有办法伪造firefox,那将是理想的。除此之外,我需要一些方法来有效地进行通货膨胀...我现在使用的东西大约需要30秒才能收缩1.2Mb的压缩文件;我想在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可以更好地完成最后一点,但我还没有完成它。)

1 个答案:

答案 0 :(得分:1)

使用此配置,您将无法做得更好**。

JavaScript太慢而无法按预期快速膨胀,并且您无法从JS可靠地调用二进制文件 - 除非将数据AJAXing到您自己的服务器(可以是本地PC)。

您的改进选择似乎是:

  1. 让浏览器自动对内容进行充气。如果您已尝试使用overrideMimeType设置application/x-gzip,则可以尝试使用GM_xmlhttpRequest代替(这是一个长镜头)。

  2. 将此内容从GM脚本转换为Firefox附加组件。作为附加组件,您可以访问二进制文件,例如 7-Zip ,甚至可以访问浏览器的inflate方法。你也许可以更容易地欺骗mimetype。



  3. **我确实注意到一些微不足道的机会来加速JS的膨胀...... length内部for检查内部的问题。唉,考虑到细节,可能不会购买超过一两秒。