Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Gravatar图像保存到数据库_Java_Image_Gravatar - Fatal编程技术网

Java 将Gravatar图像保存到数据库

Java 将Gravatar图像保存到数据库,java,image,gravatar,Java,Image,Gravatar,我想使用但不想使用他们的电子邮件地址。还有。所以我决定下载它们并将它们存储在我的数据库中。 但我对这样一个简单的任务有一个问题,因为我的个人资料图片()在下载后看起来很糟糕: 这是我使用的代码 try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { final URL url = new URL("http://www.gravatar.com/avatar/" + account.getGravatarHash

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

这是我使用的代码

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”
部分解决了这个问题,即使是在提到
“jpg”
。另外,我不想指定图像格式(除非所有的Gravatar都是
png
)。我可以避免吗?我只想保存我得到的字节。

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

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

  • 保存Gravatar为此图像提供的图像内容类型,或
  • 将图像转换为默认格式,这样您就可以为数据库中的所有图像转换为硬编码内容类型
  • 要获取Gravatar提供的标题,可以使用


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

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

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

  • 保存Gravatar为此图像提供的图像内容类型,或
  • 将图像转换为默认格式,这样您就可以为数据库中的所有图像转换为硬编码内容类型
  • 要获取Gravatar提供的标题,可以使用

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

    我找到了一个可用的解决方案:

    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();
    }
    
    看起来这适用于
    png
    jpg
    gravatar。

    我找到了一个工作解决方案:

    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();
    }
    

    看起来这适用于
    png
    jpg
    gravatar。

    单元测试拯救世界。根据从本地文件加载的相同图片测试pic字节[]。单元测试拯救世界。根据从本地文件加载的相同图片测试pic字节[]。即使将内容类型存储在数据库中,也可以获取内容类型,您可以识别文件格式。至少是图像。但它似乎适用于Chrome和Firefox,即使您没有指定响应的内容类型,或者甚至没有为
    png
    指定错误的内容类型,比如
    “image/jpeg”
    。是的,聪明的浏览器自己识别图像格式,而没有服务器的内容类型提示。但你们的问题就从这里开始了——愚蠢的浏览器依赖于这个标题。你们可以得到内容类型,即使它存储在数据库中,你们也可以识别文件格式。至少是图像。但它似乎适用于Chrome和Firefox,即使您没有指定响应的内容类型,或者甚至没有为
    png
    指定错误的内容类型,比如
    “image/jpeg”
    。是的,聪明的浏览器自己识别图像格式,而没有服务器的内容类型提示。但是你的问题就从这里开始了——愚蠢的浏览器依赖于这个标题