【问题标题】:GZipOutputStream & appengineGZipOutputStream 和应用引擎
【发布时间】:2010-12-14 20:52:54
【问题描述】:

我正在 AppEngine 上编写一个 java servlet。此 servlet 生成 png 图像。我想“gzip”响应。我是这样做的:

resp.setHeader("Content-Encoding","gzip");
resp.setContentType("image/png");

// ... png generation ...

GZIPOutputStream gzos = new GZIPOutputStream(resp.getOutputStream());
gzos.write(myPNGdata); 
gzos.close();

但是:在开发服务器中,没关系,png 显示正常,响应很好 gzip。然后我在生产服务器(AppEngine)上进行测试,我得到的只是一张“破损”的图片......

我的代码可能有什么问题?它与开发/生产环境有关吗?

当然,如果我不 gzip 输出,在两种环境中都可以。

感谢您的帮助。


编辑:我也试过这个:

GZIPOutputStream gzos = new GZIPOutputStream(resp.getOutputStream());
gzos.write(ImagesServiceFactory.makeImage(readImage("somePicture.png")).getImageData());
gzos.flush();
gzos.finish();
gzos.close();

它也不起作用。


编辑2:实际上,响应是gzip。我用“curl theUrl > tmp.gz”获取了 servlet,然后我用 gunzip 压缩了“tmp.gz”,图像很好。但是没有浏览器可以正确显示它:(我的 gzip 有什么问题?

【问题讨论】:

    标签: java google-app-engine servlets gzip gzipoutputstream


    【解决方案1】:

    App Engine 基础架构会在适当的时候为您处理 gzip 内容。你不应该自己做。

    【讨论】:

    • 我知道,但我无法从客户端(旧版应用程序)更改请求标头。但是因为它在开发服务器上工作,它应该在真正的应用程序引擎上工作,不是吗?
    • @Francois 如果它在 dev_appserver 中工作,这是一个错误 - 因为您无法在生产中自己设置这些标头。
    【解决方案2】:

    检查您下载的图片的大小。如果它比您预期的要小,很可能您需要在关闭之前刷新流。

    【讨论】:

    • 我试过 gzos.flush();gzos.finish(); 但它是一样的。在开发服务器上正常,在应用引擎上 KO。
    猜你喜欢
    • 2011-03-06
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2012-03-21
    • 2013-09-29
    • 2011-04-26
    相关资源
    最近更新 更多