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);