我的要求是通过jsp将艺术家详细信息和他的图片插入oracle数据库,并通过另一个jsp程序检索回信息和图片。
artist表有五列,四列是varchar2,第五列是blob类型。
我已经成功插入并能够成功检索,但是它只显示图像的问题。下面是代码。我被困住了。我需要帮助。请给我建议。
PreparedStatement ps=con.prepareStatement("select * from artist"); ResultSet rs=ps.executeQuery(); while(rs.next()){ %> <table><tr><th>artist fast name:</th><td><%=rs.getString(1) %></td></tr> <tr><th>artist middle name:</th><td><%=rs.getString(2) %></td></tr> <tr><th>artist last name</th><td><%=rs.getString(3) %></td></tr> <tr><th>artist job</th><td><%=rs.getString(4) %></td></tr> <tr><th>artist image</th><td><img src=" <% Blob bl=rs.getBlob(5); byte[] image=bl.getBytes(1, (int)bl.length()); response.setContentType("image/jpeg"); OutputStream o = response.getOutputStream(); o.write(image); o.flush(); o.close(); } %>" height="100" width="100" alt="bye"/> </td></tr> </table> <% con.close();
从版本6开始,Java SE提供了JAXB,通过它可以将 字节 转换为 base64 string 。在这里,您还可以将图像byte[]转换为以 64 为 基数的字符串 ,并且可以使用<img html 标记显示该图像,将src数据指定为以64为基数,即src="data:image/png;base64,。
byte[]
<img
src="data:image/png;base64,
修改您的代码,如下所示:
<% PreparedStatement ps=con.prepareStatement("select * from artist"); ResultSet rs=ps.executeQuery(); while(rs.next()){ %> <table><tr><th>artist fast name:</th><td><%=rs.getString(1) %></td></tr> <tr><th>artist middle name:</th><td><%=rs.getString(2) %></td></tr> <tr><th>artist last name</th><td><%=rs.getString(3) %></td></tr> <tr><th>artist job</th><td><%=rs.getString(4) %></td></tr> <tr><th>artist image</th><td> <% Blob bl=rs.getBlob(5); byte[] image=bl.getBytes(1, (int)bl.length()); %> <img src="data:image/jpeg;base64, <%=javax.xml.bind.DatatypeConverter.printBase64Binary(image)%> " height="100" width="100" alt="bye"/> </td></tr> </table> <% } con.close(); %>
这是另一个清晰的 jsp 示例页面:
<%@page import="java.awt.image.BufferedImage"%> <%@page import="javax.imageio.ImageIO"%> <%@page import="java.io.*"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% BufferedImage bImage = ImageIO.read(new File("/home/visruth/Desktop/Visruth.jpg"));//give the path of an image ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write( bImage, "jpg", baos ); baos.flush(); byte[] imageInByteArray = baos.toByteArray(); baos.close(); String b64 = javax.xml.bind.DatatypeConverter.printBase64Binary(imageInByteArray); %> <div> <p>As of v6, Java SE provides JAXB</p> <img src="data:image/jpg;base64, <%=b64%>" alt="Visruth.jpg not found" /> </div> </body> </html>