如何将blob转换为JSP中显示的图像

时间:2012-07-23 16:54:01

标签: java jsp blob

我正在尝试从数据库中检索图像。 目前我能够展示:

    `com.mysql.jdbc.Blob@2aba2aba `

在我的jsp输出中。 我可以知道如何将其转换为图像吗?

我使用以下内容来调出上述内容

photo[i].getPhotoFileData();

3 个答案:

答案 0 :(得分:3)

与HTML相比,HTML文档的工作方式更是一个问题。您需要了解HTML不会直接嵌入图像。相反,它使用<img>标记来引用托管在不同网址上的图片。

为了在HTML页面上显示存储在数据库中的图像,您需要一个可以处理图像请求的单独servlet。您的JSP应该呈现如下的HTML文档:

<html>
  <head>
  ...
  </head>
  <body>
    ...
    <img src="www.mydomain.com/images/1234.png" />
    ...
  </body>
</html>

然后,您将创建一个单独的servlet来处理对/ images的所有请求,这些请求将进行数据库调用,并从blob发送原始字节,然后返回到响应的输出流。确保您还根据您正在使用的图像编码正确设置了Content-Type标题。

为了将图像发送回请求者,您有两种选择之一。您可以将blob的字节作为数组获取并将其写入OutputStream(例如out.write(blob.getBytes(0,blob.length());)。或者,您可以使用getBinaryStream()方法,然后将InputStream中的字节复制到OutputStream。这是一个例子:

public static void copy(Blob from, OutputStream to)
    throws IOException {
  byte[] buf = new byte[4096];
  try(InputStream is = from.getBinaryStream()) {
    while (true) {
      int r = is.read(buf);
      if (r == -1) {
        break;
      }
      to.write(buf, 0, r);
    }
  }
}

注意:此代码尚未经过测试甚至编译,只能用作起点。

答案 1 :(得分:1)

你得到一个Blob对象 - 而不是它的内容。如果要获取原始字节数据,则必须向Blob对象询问它,例如:

Blob blob =  photo[i].getPhotoFileData();
byte[] data = blob.getBytes(0, blob.length());

如果您想动态创建图像,请调用:

BufferedImage img = ImageIO.read(new ByteArrayInputStream(data));

然后你可以保存图像或...实际上我不知道还有什么。事情。东西。显示它。打印。无限的可能性!就像在zombo.com上一样!

答案 2 :(得分:0)

首先将blob转换为输入流到字符串。然后使用该String而不是图像URL。

将blob转换为String

        try {
            Blob blob = staticOffer.getImage(); //blob of image from db
            strOut = new StringBuffer();
            String aux;
            BufferedReader br;

            br = new BufferedReader(new InputStreamReader(blob.getBinaryStream()));
            while ((aux=br.readLine())!=null) {
                strOut.append(aux);
            }
            offerPicStr = strOut.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }

现在以下列方式使用该字符串html / jsp

<img src="data:image/jpeg;base64,${offerPicStr}" width="100" height="100"></img>