Gzip是Java中的一个文件,Play Framework 2.2.1
我试图用Java在Play Framework 2.2.1中Gzip一个输出文件 这不是资产,也不是静态文件。例如,它可以是用户上传的用户化身。例如,PNG图像 我已经搜索了一个函数,只找到了如何GZIP字符串,并且Play框架对公共资产进行了自动GZIP,而这不是 我尝试过的一些代码:Gzip是Java中的一个文件,Play Framework 2.2.1,java,gzip,playframework-2.2,Java,Gzip,Playframework 2.2,我试图用Java在Play Framework 2.2.1中Gzip一个输出文件 这不是资产,也不是静态文件。例如,它可以是用户上传的用户化身。例如,PNG图像 我已经搜索了一个函数,只找到了如何GZIP字符串,并且Play框架对公共资产进行了自动GZIP,而这不是 我尝试过的一些代码: public static Result userAvatar(long userId) throws IOException { UserAvatar avatar = UserAvatar.get(
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字节。
len
总是绑定为0
在这方面:
byte[] byteArray = IOUtils.toByteArray(avatarStream);
while ((len = avatarStream.read(byteArray)) > 0) {
您读取了所有的avatarStream
-它现在是空的,只剩下0
字节。在这方面:
byte[] byteArray = IOUtils.toByteArray(avatarStream);
while ((len = avatarStream.read(byteArray)) > 0) {
你可以检查你还能读多少,也就是0
字节
替换
int len;
while ((len = avatarStream.read(byteArray)) > 0) {
gzip.write(byteArray, 0, len);
}
仅仅
gzip.write(byteArray);
我不确定问题出在哪里,但是
Play
支持gzip开箱即用:请定义“不工作”。此外,压缩JPEG/PNG/GIF格式的图像通常会导致归档文件比原始文件稍大,这通常不是一个好主意。@MonCalamari这似乎只影响通过assets.at()方法调用的静态资产。@Siguza我的意思是响应只是空的。0字节。你确定吗?在我发布的链接中,有一个gzipingtext/html
响应的例子。在Global
对象中,您可以自定义gzpied。