本文实例讲述了Java从数据库中读取Blob对象图片并显示的方法。分享给大家供大家参考。具体实现方法如下:
第一种方法:
大致方法就是,从数据库中读出Blob的流来,写到页面中去:
Connection conn = DBManager.getConnection(); String sql = "SELECT picture FROM teacher WHERE id=1"; PreparedStatement ps = null; ResultSet rs = null; InputStream is = null; OutputStream os = null; try { ps = conn.prepareStatement(sql); rs = ps.executeQuery(); if(rs.next()){ is = rs.getBinaryStream(1); } response.setContentType("text/html"); os = response.getOutputStream(); int num; byte buf[] = new byte[1024]; while( (num=is.read(buf))!=-1 ){ os.write(buf, 0, num); } } catch (SQLException e) { e.printStackTrace(); } try { is.close(); os.close(); rs.close(); ps.close(); } catch (SQLException e) { e.printStackTrace(); }
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <img name="pic" src="<%=basePath+"servlet/DownloadAsStream"%>"/>
第二种方法:
整个流程分为四步,连接oracle数据库 -> 读取blob图片字段 -> 对图片进行缩放 ->把图片展示在jsp页面上。
import java.sql.*; import java.io.*; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.awt.image.AffineTransformOp; import java.awt.geom.AffineTransform; public class OracleQueryBean { private final String oracleDriverName = "oracle.jdbc.driver.OracleDriver"; private Connection myConnection = null; private String strTabName; private String strIDName; private String strImgName; public OracleQueryBean(){ try{ Class.forName(oracleDriverName); }catch(ClassNotFoundException ex){ System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage()); } } public Connection getConnection(){ try{ //用户名+密码; 以下使用的Test就是Oracle里的表空间 //从配置文件中读取数据库信息 GetPara oGetPara = new GetPara(); String strIP = oGetPara.getPara("serverip"); String strPort = oGetPara.getPara("port"); String strDBName = oGetPara.getPara("dbname"); String strUser = oGetPara.getPara("user"); String strPassword = oGetPara.getPara("password"); this.strTabName = oGetPara.getPara("tablename"); this.strIDName = oGetPara.getPara("imgidname"); this.strImgName = oGetPara.getPara("imgname"); String oracleUrlToConnect ="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName; this.myConnection = DriverManager.getConnection(oracleUrlToConnect, strUser, strPassword); }catch(Exception ex){ System.out.println("Can not get connection:" + ex.getMessage()); System.out.println("请检测配置文件中的数据库信息是否正确." ); } return this.myConnection; } }
2. 读取blob字段
在OracleQueryBean类中增加一个函数,来进行读取,具体代码如下:
public byte[] GetImgByteById(String strID, int w, int h){ //System.out.println("Get img data which id is " + nID); if(myConnection == null) this.getConnection(); byte[] data = null; try { Statement stmt = myConnection.createStatement(); ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID); StringBuffer myStringBuffer = new StringBuffer(); if (myResultSet.next()) { java.sql.Blob blob = myResultSet.getBlob(this.strImgName); InputStream inStream = blob.getBinaryStream(); try { long nLen = blob.length(); int nSize = (int) nLen; //System.out.println("img data size is :" + nSize); data = new byte[nSize]; inStream.read(data); inStream.close(); } catch (IOException e) { System.out.println("获取图片数据失败,原因:" + e.getMessage()); } data = ChangeImgSize(data, w, h); } System.out.println(myStringBuffer.toString()); myConnection.commit(); myConnection.close(); } catch (SQLException ex) { System.out.println(ex.getMessage()); } return data; }
3. 缩放图片
因为图片的大小可能不一致,但是在页面中输出的大小需要统一,所以需要
在OracleQueryBean类中增加一个函数,来进行缩放,具体代码如下:
private byte[] ChangeImgSize(byte[] data, int nw, int nh){ byte[] newdata = null; try{ BufferedImage bis = ImageIO.read(new ByteArrayInputStream(data)); int w = bis.getWidth(); int h = bis.getHeight(); double sx = (double) nw / w; double sy = (double) nh / h; AffineTransform transform = new AffineTransform(); transform.setToScale(sx, sy); AffineTransformOp ato = new AffineTransformOp(transform, null); //原始颜色 BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR); ato.filter(bis, bid); //转换成byte字节 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bid, "jpeg", baos); newdata = baos.toByteArray(); }catch(IOException e){ e.printStackTrace(); } return newdata; }
4. 展示在页面
页面使用OracleQueryBean来根据用户提供的图片id进行查询,在读取并进行缩放后,通过jsp页面进行展示,具体代码如下:
<%@ page language="java" contentType="text/html;;charset=gbk" %> <jsp:useBean id="OrcleQuery" scope="page" class="HLFtiDemo.OracleQueryBean" /> <% response.setContentType("image/jpeg"); //图片在数据库中的 ID String strID = request.getParameter("id"); //要缩略或放大图片的宽度 String strWidth = request.getParameter("w"); //要缩略或放大图片的高度 String strHeight = request.getParameter("h"); byte[] data = null; if(strID != null){ int nWith = Integer.parseInt(strWidth); int nHeight = Integer.parseInt(strHeight); //获取图片的byte数据 data = OrcleQuery.GetImgByteById(strID, nWith, nHeight); ServletOutputStream op = response.getOutputStream(); op.write(data, 0, data.length); op.close(); op = null; response.flushBuffer(); //清除输出流,防止释放时被捕获异常 out.clear(); out = pageContext.pushBody(); } %>
5. OracleQueryBean查询类的整体代码
OracleQueryBean.java文件代码如下所示:
import java.sql.*; import java.io.*; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.awt.image.AffineTransformOp; import java.awt.geom.AffineTransform; public class OracleQueryBean { private final String oracleDriverName = "oracle.jdbc.driver.OracleDriver"; private Connection myConnection = null; private String strTabName; private String strIDName; private String strImgName; public OracleQueryBean(){ try{ Class.forName(oracleDriverName); }catch(ClassNotFoundException ex){ System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage()); } } public Connection getConnection(){ try{ //用户名+密码; 以下使用的Test就是Oracle里的表空间 //从配置文件中读取数据库信息 GetPara oGetPara = new GetPara(); String strIP = oGetPara.getPara("serverip"); String strPort = oGetPara.getPara("port"); String strDBName = oGetPara.getPara("dbname"); String strUser = oGetPara.getPara("user"); String strPassword = oGetPara.getPara("password"); this.strTabName = oGetPara.getPara("tablename"); this.strIDName = oGetPara.getPara("imgidname"); this.strImgName = oGetPara.getPara("imgname"); String oracleUrlToConnect ="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName; this.myConnection = DriverManager.getConnection(oracleUrlToConnect, strUser, strPassword); }catch(Exception ex){ System.out.println("Can not get connection:" + ex.getMessage()); System.out.println("请检测配置文件中的数据库信息是否正确." ); } return this.myConnection; } public byte[] GetImgByteById(String strID, int w, int h){ //System.out.println("Get img data which id is " + nID); if(myConnection == null) this.getConnection(); byte[] data = null; try { Statement stmt = myConnection.createStatement(); ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID); StringBuffer myStringBuffer = new StringBuffer(); if (myResultSet.next()) { java.sql.Blob blob = myResultSet.getBlob(this.strImgName); InputStream inStream = blob.getBinaryStream(); try { long nLen = blob.length(); int nSize = (int) nLen; //System.out.println("img data size is :" + nSize); data = new byte[nSize]; inStream.read(data); inStream.close(); } catch (IOException e) { System.out.println("获取图片数据失败,原因:" + e.getMessage()); } data = ChangeImgSize(data, w, h); } System.out.println(myStringBuffer.toString()); myConnection.commit(); myConnection.close(); } catch (SQLException ex) { System.out.println(ex.getMessage()); } return data; }public byte[] GetImgByteById(String strID){ //System.out.println("Get img data which id is " + nID); if(myConnection == null) this.getConnection(); byte[] data = null; try { Statement stmt = myConnection.createStatement(); ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID); StringBuffer myStringBuffer = new StringBuffer(); if (myResultSet.next()) { java.sql.Blob blob = myResultSet.getBlob(this.strImgName); InputStream inStream = blob.getBinaryStream(); try { long nLen = blob.length(); int nSize = (int) nLen; data = new byte[nSize]; inStream.read(data); inStream.close(); } catch (IOException e) { System.out.println("获取图片数据失败,原因:" + e.getMessage()); } } System.out.println(myStringBuffer.toString()); myConnection.commit(); myConnection.close(); } catch (SQLException ex) { System.out.println(ex.getMessage()); } return data; }
private byte[] ChangeImgSize(byte[] data, int nw, int nh){ byte[] newdata = null; try{ BufferedImage bis = ImageIO.read(new ByteArrayInputStream(data)); int w = bis.getWidth(); int h = bis.getHeight(); double sx = (double) nw / w; double sy = (double) nh / h; AffineTransform transform = new AffineTransform(); transform.setToScale(sx, sy); AffineTransformOp ato = new AffineTransformOp(transform, null); //原始颜色 BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR); ato.filter(bis, bid); //转换成byte字节 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bid, "jpeg", baos); newdata = baos.toByteArray(); }catch(IOException e){ e.printStackTrace(); } return newdata; } }
下面是我的存储读取blob图片的案例
import java.sql.*; import java.io.*; public class InsertPhoto { public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/wiseweb?user=root&password=root"); File f = new File("e:/123.jpg"); FileInputStream fis = new FileInputStream(f); String sql = "insert into photo(photo,photoName) values(?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setBinaryStream(1,fis,(int)f.length()); pstmt.setString(2, "测试图片"); pstmt.executeUpdate(); fis.close(); pstmt.close(); con.close(); } }
import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.imageio.ImageIO; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder;public class ReadPhoto extends HttpServlet{ private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response){ if(request.getParameter("id") != null){ response.setContentType("image/jpeg"); try { InputStream is = query_getPhotoImageBlob(Integer.parseInt(request.getParameter("id"))) ; if(is != null){ is = new BufferedInputStream(is) ; BufferedImage bi = ImageIO.read(is) ; OutputStream os = response.getOutputStream() ; JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os) ; encoder.encode(bi); os.close(); is.close(); } } catch(IOException e){ e.printStackTrace(); }catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static InputStream query_getPhotoImageBlob(int id) throws ClassNotFoundException, SQLException{ String sql = "select photo from photo where id="+id; Connection con = null; Statement stmt = null; ResultSet rs = null; InputStream result = null; try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/wiseweb?user=root&password=root"); stmt = con.createStatement(); rs = stmt.executeQuery(sql); if (rs.next()) result = rs.getBlob("photo").getBinaryStream(); } catch (SQLException e) { // TODO: handle exception System.err.println(e.getMessage()); }finally{ rs.close(); stmt.close(); con.close(); } return result; } }
jsp显示
<img style="width:320px;height:240px" src="<%=basePath%>/genImage?id=3"/>
web.xml中配置
<servlet> <servlet-name>genImage</servlet-name> <servlet-class>ReadPhoto</servlet-class> </servlet> <servlet-mapping> <servlet-name>genImage</servlet-name> <url-pattern>/genImage</url-pattern> </servlet-mapping>
希望本文所述对大家的Java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#niaoge.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。