我正在尝试使用Java在Play Framework 2.2.1中为Gzip输出文件。
这不是资产,它不是静态文件。例如,它可以是用户上传的用户头像。例如,PNG图像。
我搜索过这个并且只发现了如何使用GZIP字符串以及Play Framework对公共资产进行自动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());
}
这不起作用,谷歌只返回gzipping字符串的答案。有人可以帮忙吗?
编辑:在这种情况下不起作用意味着结果是0字节。
答案 0 :(得分:1)
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);