【发布时间】:2015-08-18 10:41:53
【问题描述】:
我正在尝试使用 Java 压缩文件以在 Play Framework 2.2.1 中输出。
这不是资产,也不是静态文件。例如,它可以是用户上传的用户头像。例如,PNG 图像。
我已经对此进行了搜索,只找到了如何 GZIP 字符串,并且 Play 框架对公共资产进行自动 Gzipping,但事实并非如此。
我尝试过的一些代码:
public static Result userAvatar(long userId) throws IOException {
UserAvatar avatar = UserAvatar.get(userId);
InputStream avatarStream;
Long version;
// Use the default avatar.
if (avatar == null) {
avatarStream = Play.current().resourceAsStream("public/images/noavatar.png").get();
version = 0L;
} else {
avatarStream = new ByteArrayInputStream(avatar.avatar);
version = avatar.version;
}
byte[] byteArray = IOUtils.toByteArray(avatarStream);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(byteArray.length);
OutputStream gzip = new GZIPOutputStream(outputStream);
int len;
while ((len = avatarStream.read(byteArray)) > 0) {
gzip.write(byteArray, 0, len);
}
avatarStream.close();
gzip.close();
// The client has the correct image cached if the ETag matches
String eTag = request().getHeader("If-None-Match");
if (eTag != null && eTag.equals(version.toString())) {
return status(NOT_MODIFIED, "Not modified");
}
response().setContentType("image/png");
response().setHeader(ETAG, version.toString());
return Results.ok(outputStream.toByteArray());
}
这不起作用,谷歌只返回 gzip 字符串的答案。有人可以帮忙吗?
编辑:在这种情况下不起作用意味着结果为 0 字节。
【问题讨论】:
-
我不确定是什么问题,但
Play支持 gzip 开箱即用:playframework.com/documentation/2.2.x/GzipEncoding -
请定义“不起作用”。此外,以 JPEG/PNG/GIF 格式压缩图像通常会导致存档比原始文件稍大,这通常不是一个好主意。
-
@MonCalamari 这似乎只影响通过 Assets.at() 方法调用的静态资产。
-
@Siguza 我的意思是响应是空的。 0 字节。
-
你确定吗?在我发布的链接中,有一个 gziping
text/html响应的示例。在Global对象中,您可以自定义 gzpied 的内容。
标签: java gzip playframework-2.2