代码之家  ›  专栏  ›  技术社区  ›  Tyler Clendenin

GZip Coldfusion输出的字符串在浏览器中导致“内容编码错误”

  •  7
  • Tyler Clendenin  · 技术社区  · 14 年前

    <cfsavecontent variable="toGZIP"><html><head><title>Test</title></head><body><h1>Fear my test</h1></body></html></cfsavecontent>
    
    <cfscript>
    ioOutput = CreateObject("java","java.io.ByteArrayOutputStream");
    gzOutput = CreateObject("java","java.util.zip.GZIPOutputStream");
    
    ioOutput.init();
    gzOutput.init(ioOutput);
    
    gzOutput.write(toGZIP.getBytes("UTF-8"), 0, Len(toGZIP.getBytes()));
    
    gzOutput.finish();
    gzOutput.close();
    ioOutput.flush();
    ioOutput.close();
    
    toOutput=ioOutput.toString("UTF-8");
    </cfscript>
    
    <cfcontent reset="yes" /><cfheader name="Content-Encoding" value="gzip"><cfheader name="Content-Length" value="#ArrayLen( toOuptut.getBytes() )#" ><cfoutput>#toOuptut#</cfoutput><cfabort />
    

    但是我在Firefox(以及chrome和Safari)中遇到了一个错误

    内容编码错误

    无法显示您试图查看的页面,因为它使用了无效或不受支持的压缩形式。

    有人有什么想法吗?

    操作系统:Mac OX-X雪豹
    CF:9-开发


    解决方案

    <cfsavecontent variable="toGZIP"><html><head><title>Test</title></head><body><h1>Fear my test</h1></body></html></cfsavecontent>
    
    <cfscript>
    ioOutput = CreateObject("java","java.io.ByteArrayOutputStream");
    gzOutput = CreateObject("java","java.util.zip.GZIPOutputStream");
    
    ioOutput.init();
    gzOutput.init(ioOutput);
    
    gzOutput.write(toGZIP.getBytes(), 0, Len(toGZIP.getBytes()));
    
    gzOutput.finish();
    gzOutput.close();
    ioOutput.flush();
    ioOutput.close();
    
    toOutput=ioOutput.toByteArray();
    </cfscript>
    
    <cfheader name="Content-Encoding" value="gzip"><cfheader name="Content-Length" value="#ArrayLen(toOutput)#" ><cfcontent reset="yes" variable="#toOutput#" /><cfabort />
    
    3 回复  |  直到 4 年前
        1
  •  4
  •   Horcrux7    14 年前

    下面这句话看起来完全错了:

    toOutput=ioOutput.toString("UTF-8");
    

    用UTF8对GZip流进行编码。结果是垃圾数据。如果ColdFusion有这个选项,最好将GZip数据设置为二进制。如果您只能设置一个字符串,那么您需要一个不改变任何字节的编码。例如iso1。

        2
  •  1
  •   Community Nick Dandoulakis    7 年前

    有没有理由让web服务器(IIS或Apache)来处理这个问题?它们都支持GZip编码,并且 这样做比手动过程更快更好。

        3
  •  0
  •   Sergey Galashyn    14 年前

    请注意,代码中有语法错误: toOuptut 而不是 toOutput .

    顺便说一句,验证GZip的浏览器支持非常简单。你可以查一下 Accept-Encoding 标题,如下所示:

    <cfif FindNoCase("gzip", cgi.HTTP_ACCEPT_ENCODING)>
        <!--- prepare the gzipped text --->
    </cfif>