激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java從數據庫中讀取Blob對象圖片并顯示的方法

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

2019-12-09 14:48Benjamin_whx JAVA教程

這篇文章主要介紹了Java從數據庫中讀取Blob對象圖片并顯示的方法,實例分析了Java讀取數據庫中Blob對象圖片的技巧與操作方法,需要的朋友可以參考下

本文實例講述了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 | 欧美激情在线播放 | 日本精品久久久一区二区三区 | 一区二区网 | 久久探花| 久久久入口 | 国产69精品久久久久久 | 激情毛片| 免费毛片观看 | 黄免费观看视频 | 欧美综合在线观看 | 激情影院在线观看 | 久久精片| 鲁久久 | 国产精品久久久久久影视 | 黄色av电影在线 | 久色免费视频 | 色av综合在线 | 九色激情网 | 久久国产精品91 | 日本aaa一级片 | 久久久久久久久久久久久久国产 | 国产成人综合在线观看 | 亚洲性视频 | 免费国产视频在线观看 | 黄色影视大全 | 久久久久久久亚洲精品 | 精品久久久久久久久久久久包黑料 | 国产精品久久久久久久不卡 | 蜜桃网在线 | 黄色一级毛片免费看 | 免费观看高清视频网站 | 国产大片全部免费看 | 亚洲午夜免费电影 | 精品久久一区二区 |