Gzip Java 中的文件,Play Framework 2.2.1
Gzip a file in Java, Play Framework 2.2.1
我正在尝试 Gzip 文件以在 Play Framework 2.2.1 中输出,Java。
这不是资产,也不是静态文件。例如,它可以是用户上传的用户头像。例如 PNG 图片。
我为此搜索了一个,只找到了如何对字符串进行 GZIP 压缩,并且 Play Framework 会自动对 public 资产进行 Gzip 压缩,但事实并非如此。
我试过的一些代码:
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());
}
这没有用,google 只返回 gzip 字符串的答案。有人可以帮忙吗?
编辑:在这种情况下不起作用意味着结果是 0 字节。
len
必然总是 0
.
这一行:
byte[] byteArray = IOUtils.toByteArray(avatarStream);
您阅读了全部 avatarStream
- 它现在是空的,还剩下 0
字节。
在这一行中:
while ((len = avatarStream.read(byteArray)) > 0) {
你检查一下你还能读多少 - 这是 0
字节。
替换
int len;
while ((len = avatarStream.read(byteArray)) > 0) {
gzip.write(byteArray, 0, len);
}
仅
gzip.write(byteArray);
我正在尝试 Gzip 文件以在 Play Framework 2.2.1 中输出,Java。
这不是资产,也不是静态文件。例如,它可以是用户上传的用户头像。例如 PNG 图片。
我为此搜索了一个,只找到了如何对字符串进行 GZIP 压缩,并且 Play Framework 会自动对 public 资产进行 Gzip 压缩,但事实并非如此。
我试过的一些代码:
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());
}
这没有用,google 只返回 gzip 字符串的答案。有人可以帮忙吗?
编辑:在这种情况下不起作用意味着结果是 0 字节。
len
必然总是 0
.
这一行:
byte[] byteArray = IOUtils.toByteArray(avatarStream);
您阅读了全部 avatarStream
- 它现在是空的,还剩下 0
字节。
在这一行中:
while ((len = avatarStream.read(byteArray)) > 0) {
你检查一下你还能读多少 - 这是 0
字节。
替换
int len;
while ((len = avatarStream.read(byteArray)) > 0) {
gzip.write(byteArray, 0, len);
}
仅
gzip.write(byteArray);