1. 首頁
  2. 資料庫作業系統

講解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+"/";

%>

搞定。

第二種方法:

整個流程分為四步,連線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">

<%

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 = " 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顯示

複製程式碼 程式碼如下:

web.xml中配置

複製程式碼 程式碼如下:

genImage

ReadPhoto

genImage

/genImage

希望本文所述對大家的Java程式設計有所幫助。