源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java从数据库中读取Blob对象图片并显示的方法

  • 时间:2021-02-16 20:03 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java从数据库中读取Blob对象图片并显示的方法
本文实例讲述了Java从数据库中读取Blob对象图片并显示的方法。分享给大家供大家参考。具体实现方法如下: 第一种方法: 大致方法就是,从数据库中读出Blob的流来,写到页面中去:
[u]复制代码[/u] 代码如下:
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(); }
  在页面中:
[u]复制代码[/u] 代码如下:
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>   <img name="pic" src="<%=basePath+"servlet/DownloadAsStream"%>"/>
  搞定。 第二种方法: 整个流程分为四步,连接oracle数据库 -> 读取blob图片字段 -> 对图片进行缩放 ->把图片展示在jsp页面上。
[u]复制代码[/u] 代码如下:
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类中增加一个函数,来进行读取,具体代码如下:
[u]复制代码[/u] 代码如下:
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类中增加一个函数,来进行缩放,具体代码如下:
[u]复制代码[/u] 代码如下:
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页面进行展示,具体代码如下:
[u]复制代码[/u] 代码如下:
<%@ 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文件代码如下所示:
[u]复制代码[/u] 代码如下:
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图片的案例
[u]复制代码[/u] 代码如下:
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();       }  }
[u]复制代码[/u] 代码如下:
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显示
[u]复制代码[/u] 代码如下:
<img style="width:320px;height:240px" src="<%=basePath%>/genImage?id=3"/>
web.xml中配置
[u]复制代码[/u] 代码如下:
<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程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部