【问题标题】:GZip a string for output from Coldfusion results in "Content Encoding Error" in browsersGZip 用于从 Coldfusion 输出的字符串导致浏览器中出现“内容编码错误”
【发布时间】:2011-04-11 06:27:37
【问题描述】:

我正在尝试将变量中的 GZip 内容输出到浏览器。首先,我让这变得非常简单,而不用担心不支持 gzip 的浏览器。此外,我通过研究可以在网上找到的几种方法将其组合在一起。其中一些来自可能正在阅读此问题的人。

<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 Snow Leopard
CF:9-Dev
网络服务器:Apache


解决方案

<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 />

【问题讨论】:

  • @tyler-- 你还在使用这个返回值吗?你是否从内部管理 gzip 进程中看到了好的结果?我也想自己尝试这样做。我无法让 IIS 7.0 对动态内容 (.cfm) 页面进行 gzip,尽管它声称可以。你有没有试过让 IIS 来做这件事?
  • 我没有尝试让 IIS 对动态页面进行 gzip 压缩,但我认为我不想这样做,因为这会产生巨大的每个请求开销。管理压缩内容有效。我还没有机会彻底测试它的极限,但我希望很快。

标签: java coldfusion gzip


【解决方案1】:

以下行看起来完全错误:

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

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

【讨论】:

  • 我不确定你的意思。你有什么建议?我认为你可能是对的,但我不知道还能做什么。
  • 啊哈,我明白了,你是对的。我删除了 toString 并将其作为二进制输出,然后使用 cfcontent 标记的变量属性将二进制发送到浏览器。
【解决方案2】:

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

很遗憾,我不是 Java 专家,也不能说到底出了什么问题。但是当我尝试使用 wget 将内容保存到文件中时,它包含的不是压缩的二进制文件,而是源 HTML。这可能意味着与 gzOutput 相关的处理不会产生正确的输出。

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

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

【讨论】:

  • 是的,toOuptut 是一个复制粘贴问题,因为我将代码压缩成在这里看起来更好的东西,哎呀。
【解决方案3】:

您是否有理由手动执行此操作而不是让 Web 服务器(IIS 或 Apache)处理此问题?它们都支持 GZip 编码,并且可能比您的手动过程更快更好。

【讨论】:

  • 我将在 gzip 中进行自己的缓存,因为 IIS 不会缓存动态生成的内容。我打算让 IIS 只是 gzip 静态缓存内容。
  • 您可以在 ehcache 中缓存 gzip 的数据。 ;)
猜你喜欢
  • 1970-01-01
  • 2018-07-23
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多