将Gravatar图像保存到数据库

时间:2015-10-12 22:19:38

标签: java image gravatar

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

enter image description here

这是我使用的代码。

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"也是如此。另外,我不想指定图像格式(除非所有Gravatars都是png)。我可以避免吗?我想保存我得到的字节。

2 个答案:

答案 0 :(得分:0)

大多数情况下,浏览器使用原始字节。然而,非常感谢发送" Content-Type:image /..."每张图片的标题。

在DB中保存字节时,您还必须

  1. 保存图片内容类型,由Gravatar提供此图片或
  2. 将图片转换为默认格式,以便您可以对数据库中所有图片的内容类型进行硬编码
  3. 要获得Gravatar提供的标题,您可以使用Apache HTTP Client

    要将图片转换为首选格式,您可以使用ImageIO。

答案 1 :(得分:0)

我找到了一个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。