如果输出流未显示,请尝试刷新并关闭它。Blob image = rs.getBlob(ImageColName);InputStream in = image.getBinaryStream();//将blob输出到HttpServletResponse response.setContentType("image/jpeg");BufferedOutputStream o = new BufferedOutputStream(response.getOutputStream());
byte by[] = new byte[32768];
int index = in.read(by, 0, 32768);
while (index != -1) {
o.write(by, 0, index);
index = in.read(by, 0, 32768);
}
o.flush();
o.close();
6条答案
按热度按时间pod7payv1#
让我们分步骤看看应该发生什么:
<img>
元素。src
属性。src
属性需要指向一个有效的http://
URL,而不是本地磁盘文件系统路径file://
,因为当服务器和客户端在物理上不同的机器上运行时,src
将永远无法工作。http://example.com/context/images/foo.png
)或作为请求参数(例如http://example.com/context/images?id=1
)中具有图像标识符。/images/*
),这样您就可以在特定的URL上执行一些Java代码。byte[]
或InputStream
的形式获取,JDBC API为此提供了ResultSet#getBytes()
和ResultSet#getBinaryStream()
,JPA API为此提供了@Lob
。byte[]
或InputStream
写入响应的OutputStream
。Content-Type
响应头。您可以通过ServletContext#getMimeType()
基于映像文件扩展名获得正确的响应头,您可以通过web.xml
中的<mime-mapping>
扩展和/或覆盖映像文件扩展名。应该是这样的,它几乎可以自己编写代码,让我们从HTML(在JSP中)开始:
如有必要,您还可以在使用JSTL进行迭代的同时使用EL动态设置
src
:然后定义/创建一个servlet,它侦听URL模式为
/images/*
的GET请求,下面的示例使用普通JDBC执行该作业:如果您担心HEAD和缓存头文件以及正确响应这些请求,请使用这个抽象模板作为静态资源servlet。
另请参见:
2fjabf4q2#
我建议你把它当作两个问题来处理。有几个问题和答案与这两个问题都相关。
1.如何从MySQL加载blob
例如,请参见Retrieve image stored as blob
1.如何动态显示图像
请参见例如动态显示缩略图
lsmepo6l3#
我已经用Oracle数据库编写并配置了JSP中的代码。希望能有所帮助。
3lxsmp7m4#
如果输出流未显示,请尝试刷新并关闭它。
Blob image = rs.getBlob(ImageColName);
InputStream in = image.getBinaryStream();
//将blob输出到HttpServletResponseresponse.setContentType("image/jpeg");
BufferedOutputStream o = new BufferedOutputStream(response.getOutputStream());
vdgimpew5#
我使用了SQL SERVER数据库,所以答案的代码是一致的。您所要做的就是在jsp页面中包含一个
<img>
标记,并从其src属性调用servlet,如下所示这里1是图像在数据库中的唯一ID,ID是一个变量。我们在servlet中接收这个变量的值。在servlet代码中,我们从表中正确的列中获取二进制流输入。这就是你的图像存储在哪一列中。在我的代码中,我使用第三列,因为我的图像作为二进制数据存储在第三列中。从表中检索输入流数据后,我们在输出流中读取其内容,以便将其写入屏幕。
执行完jsp或html文件后,您将在屏幕上看到图像。
camsedfj6#
您还可以创建自定义标记来显示图像。
1)创建自定义标签java类和tld文件。
2)编写逻辑以显示图像,如通过Base64将byte[]转换为string。
因此,无论您在单个JSP页面中只显示一个图像还是显示多个图像,它都用于每个图像。