【问题标题】:Saving Gravatar images to the database将 Gravatar 图像保存到数据库
【发布时间】:2015-10-12 22:19:37
【问题描述】:

我想使用Gravatar,但我不想publish users MD5 hashes 他们的电子邮件地址。还有more potential problems。所以我决定下载它们并将它们存储在我的数据库中。
但是我的个人资料图片(Earlybird)在下载后看起来很糟糕:

这是我使用的代码。

try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
    final URL url = new URL("http://www.gravatar.com/avatar/" + account.getGravatarHash() + "?d=identicon");
    final BufferedImage image = ImageIO.read(url);
    ImageIO.write(image, "jpg", baos);
    pic = baos.toByteArray();
} catch (IOException e) {
    e.printStackTrace();
}

pic 中的值然后直接存储到数据库中。我数据库中的其他图片都存储得很好,所以问题一定出在这些行中。

编辑:
我只是通过将"jpg" 更改为"png" 来部分解决问题,甚至认为Gravatar tutorial 提到了"jpg"。我也不想指定图像格式(除非所有 Gravatar 都是 png)。我可以避免吗?我只想保存我得到的字节。

【问题讨论】:

  • 单元测试拯救世界。针对从本地文件加载的同一张图片测试您的图片 byte[]。

标签: java image gravatar


【解决方案1】:

浏览器在大多数情况下都使用原始字节。但是,非常感谢为每个图像发送“Content-Type: image/...”标头。

当您在数据库中保存字节时,您还必须

  1. 保存图片内容类型,由 Gravatar 为该图片提供,或
  2. 将图像转换为您的默认格式,这样您就可以硬编码数据库中所有图像的内容类型

要获取 Gravatar 提供的标题,您可以使用Apache HTTP Client

要将图像转换为您喜欢的格式,您可以使用 ImageIO。

【讨论】:

  • 您可以获取内容类型,即使它存储在数据库中,您也可以识别文件格式。至少对于图像。但看起来它适用于 Chrome 和 Firefox,即使您没有指定内容类型作为响应,甚至没有为 png 提供错误的内容类型,例如 "image/jpeg"
  • 是的,聪明的浏览器自己识别图像格式,没有来自服务器的内容类型提示。但是您的问题只是从这里提出的-愚蠢的浏览器会在此标头上中继
【解决方案2】:

我找到了一个similar problem 的解决方案:

try (ByteArrayOutputStream baos = new ByteArrayOutputStream()){
    final URL url = new URL("http://www.gravatar.com/avatar/" + account.getGravatarHash() + "?d=identicon");
    InputStream inputStream = url.openStream();
    byte[] buffer = new byte[1024];
    int n;
    while (-1 != (n = inputStream.read(buffer))) {
        baos.write(buffer, 0, n);
    }
    inputStream.close();
    pic = baos.toByteArray();
} catch (IOException e) {
    e.printStackTrace();
}

看起来这适用于 pngjpg Gravatars。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-10
    • 2019-06-27
    • 1970-01-01
    • 2020-03-07
    • 2020-04-07
    相关资源
    最近更新 更多