使用Java,Play Framework 2.2.1 Gzip文件

时间:2015-08-18 10:41:53

标签: java gzip playframework-2.2

我正在尝试使用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字节。

1 个答案:

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