Gzip是Java中的一个文件,Play Framework 2.2.1

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(

我试图用Java在Play Framework 2.2.1中Gzip一个输出文件

这不是资产,也不是静态文件。例如,它可以是用户上传的用户化身。例如,PNG图像

我已经搜索了一个函数,只找到了如何GZIP字符串,并且Play框架对公共资产进行了自动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());
}
这不起作用,谷歌只返回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字节。你确定吗?在我发布的链接中,有一个gziping
text/html
响应的例子。在
Global
对象中,您可以自定义gzpied。