【问题标题】:Gzip a file in Java, Play Framework 2.2.1用 Java 压缩文件,Play Framework 2.2.1
【发布时间】:2015-08-18 10:41:53
【问题描述】:

我正在尝试使用 Java 压缩文件以在 Play Framework 2.2.1 中输出。

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

我已经对此进行了搜索,只找到了如何 GZIP 字符串,并且 Play 框架对公共资产进行自动 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());
}

这不起作用,谷歌只返回 gzip 字符串的答案。有人可以帮忙吗?

编辑:在这种情况下不起作用意味着结果为 0 字节。

【问题讨论】:

  • 我不确定是什么问题,但Play 支持 gzip 开箱即用:playframework.com/documentation/2.2.x/GzipEncoding
  • 请定义“不起作用”。此外,以 JPEG/PNG/GIF 格式压缩图像通常会导致存档比原始文件稍大,这通常不是一个好主意。
  • @MonCalamari 这似乎只影响通过 Assets.at() 方法调用的静态资产。
  • @Siguza 我的意思是响应是空的。 0 字节。
  • 你确定吗?在我发布的链接中,有一个 gziping text/html 响应的示例。在Global 对象中,您可以自定义 gzpied 的内容。

标签: java gzip playframework-2.2


【解决方案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);

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 2014-02-09
    • 1970-01-01
    • 2022-07-27
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多