亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java從數據庫中讀取Blob對象圖片并顯示的方法

2019-11-26 15:18:05
字體:
來源:轉載
供稿:網友

本文實例講述了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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品极品毛片系列视频| 欧美日韩精品二区| 国产主播喷水一区二区| 色综合久综合久久综合久鬼88| 在线成人中文字幕| 亚洲国产精品推荐| 亚洲黄页视频免费观看| 国内精品免费午夜毛片| 国产成人精品久久二区二区| 久久精品成人动漫| 亚洲精品美女在线观看| 亚洲天堂日韩电影| 亚洲精品98久久久久久中文字幕| 亚洲日本成人女熟在线观看| 欧美亚州一区二区三区| 久久久精品国产网站| 亚洲一区二区三区久久| 在线观看中文字幕亚洲| 免费不卡欧美自拍视频| 国产免费亚洲高清| 亚洲片国产一区一级在线观看| 日韩av色综合| 国产在线观看91精品一区| 91精品久久久久久久久| 国产精品扒开腿做爽爽爽视频| 精品国产一区二区在线| 亚洲精品久久在线| 久久久久成人网| 亚洲欧美制服丝袜| 91精品国产91久久久久久| 精品福利樱桃av导航| 日韩欧亚中文在线| 97婷婷涩涩精品一区| 国产精品夜色7777狼人| 这里只有精品在线观看| 这里只有精品久久| 成人av色在线观看| 久久天天躁狠狠躁夜夜躁2014| 欲色天天网综合久久| 在线观看日韩视频| 久久久极品av| 色综合色综合久久综合频道88| 日韩av一区在线观看| 91视频国产精品| 欧美极品少妇xxxxⅹ喷水| 51ⅴ精品国产91久久久久久| 日韩欧美在线视频日韩欧美在线视频| 亚洲国产精品久久久久| 日韩高清av在线| 国产精品网址在线| 国产精品一区二区女厕厕| 日韩中文有码在线视频| 亚洲免费视频网站| 久久精品色欧美aⅴ一区二区| 日韩免费观看高清| 97碰碰碰免费色视频| 久久久精品一区二区三区| 黄色一区二区在线| 成人网页在线免费观看| 欧美小视频在线观看| 日本一区二区三区四区视频| 久久久国产一区二区三区| 亚洲国产古装精品网站| 国产精品久久av| 91精品国产91久久久久久最新| 日韩视频亚洲视频| 日韩欧美一区二区在线| 欧美成人午夜免费视在线看片| 亚洲一区二区三区在线免费观看| 亚洲精品美女在线观看播放| 日韩日本欧美亚洲| www国产亚洲精品久久网站| 91亚洲国产成人久久精品网站| 国产成人精品久久二区二区91| 亚洲男女性事视频| 亚洲精品久久久久久久久久久久久| 国产精品一区二区在线| 亚洲午夜久久久影院| 国产精品wwww| 久操成人在线视频| 欧美做爰性生交视频| 亚洲午夜色婷婷在线| 成人激情免费在线| 8090理伦午夜在线电影| 国产一区二区三区视频在线观看| 欧美日韩亚洲精品一区二区三区| 精品一区二区电影| 欧美成人免费全部| 亚洲91av视频| 亚洲精品456在线播放狼人| 日韩亚洲一区二区| 日韩av理论片| 中文字幕在线看视频国产欧美在线看完整| 日韩在线视频观看正片免费网站| y97精品国产97久久久久久| 亚洲国产日韩欧美综合久久| 亚洲欧美中文在线视频| 精品视频一区在线视频| 日韩av毛片网| 日本久久久久亚洲中字幕| 91国在线精品国内播放| 国产不卡av在线| 亚洲中国色老太| 在线观看欧美成人| 亚洲欧美中文日韩在线v日本| 亚洲一区中文字幕在线观看| 亚洲精品乱码久久久久久按摩观| 亚洲视频在线观看视频| 国产成人av网址| 一区二区欧美日韩视频| 亚洲一区二区在线播放| 国产精品成人av性教育| 国产一区视频在线播放| 亚洲新声在线观看| 91精品在线播放| 亚洲国产私拍精品国模在线观看| 久久视频精品在线| 成人伊人精品色xxxx视频| 成人动漫网站在线观看| 7777精品久久久久久| 中文字幕在线亚洲| 欧美日韩免费在线| 日本精品一区二区三区在线播放视频| 亚洲精品动漫久久久久| 欧美黑人又粗大| 欧美日韩国产中字| 欧美日韩电影在线观看| 久久精品99久久久久久久久| 国产成人jvid在线播放| 中文字幕成人精品久久不卡| 最近2019免费中文字幕视频三| 俺去亚洲欧洲欧美日韩| 日韩在线播放一区| 国产精品一区久久| 国产精品久久久久国产a级| 国模精品系列视频| 亚洲娇小xxxx欧美娇小| 91国内揄拍国内精品对白| 国产在线精品一区免费香蕉| 亚洲日韩欧美视频| 国产激情999| 2019中文字幕全在线观看| 97色伦亚洲国产| 一区二区三区在线播放欧美| 精品香蕉一区二区三区| 久久精品国产v日韩v亚洲| www.欧美免费| 欧美激情一区二区三区在线视频观看| 丰满岳妇乱一区二区三区| 日韩中文字幕在线视频播放| 亚洲午夜未满十八勿入免费观看全集| 91欧美日韩一区| 狠狠色香婷婷久久亚洲精品| 欧美日本亚洲视频| 这里精品视频免费| 日韩精品在线私人| 欧美国产日本高清在线| 色噜噜亚洲精品中文字幕| 日韩av在线影院| 亚洲精品二三区| 亚洲另类欧美自拍| 91精品国产综合久久久久久蜜臀| 欧美电影在线观看网站| 91网站免费观看|