Java從數(shù)據(jù)庫(kù)中讀取Blob對(duì)象圖片并顯示的方法
本文實(shí)例講述了Java從數(shù)據(jù)庫(kù)中讀取Blob對(duì)象圖片并顯示的方法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
第一種方法:
大致方法就是,從數(shù)據(jù)庫(kù)中讀出Blob的流來(lái),寫到頁(yè)面中去:
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();
}
在頁(yè)面中:
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<img name="pic" src="<%=basePath+"servlet/DownloadAsStream"%>"/>
搞定。
第二種方法:
整個(gè)流程分為四步,連接oracle數(shù)據(jù)庫(kù) -> 讀取blob圖片字段 -> 對(duì)圖片進(jìn)行縮放 ->把圖片展示在jsp頁(yè)面上。
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驅(qū)動(dòng)失敗,原因:" + ex.getMessage());
}
}
public Connection getConnection(){
try{
//用戶名+密碼; 以下使用的Test就是Oracle里的表空間
//從配置文件中讀取數(shù)據(jù)庫(kù)信息
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("請(qǐng)檢測(cè)配置文件中的數(shù)據(jù)庫(kù)信息是否正確." );
}
return this.myConnection;
}
}
2. 讀取blob字段
在OracleQueryBean類中增加一個(gè)函數(shù),來(lái)進(jìn)行讀取,具體代碼如下:
//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("獲取圖片數(shù)據(jù)失敗,原因:" + 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. 縮放圖片
因?yàn)閳D片的大小可能不一致,但是在頁(yè)面中輸出的大小需要統(tǒng)一,所以需要
在OracleQueryBean類中增加一個(gè)函數(shù),來(lái)進(jìn)行縮放,具體代碼如下:
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);
//轉(zhuǎn)換成byte字節(jié)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bid, "jpeg", baos);
newdata = baos.toByteArray();
}catch(IOException e){
e.printStackTrace();
}
return newdata;
}
4. 展示在頁(yè)面
頁(yè)面使用OracleQueryBean來(lái)根據(jù)用戶提供的圖片id進(jìn)行查詢,在讀取并進(jìn)行縮放后,通過jsp頁(yè)面進(jìn)行展示,具體代碼如下:
<jsp:useBean id="OrcleQuery" scope="page" class="HLFtiDemo.OracleQueryBean" />
<%
response.setContentType("image/jpeg");
//圖片在數(shù)據(jù)庫(kù)中的 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數(shù)據(jù)
data = OrcleQuery.GetImgByteById(strID, nWith, nHeight);
ServletOutputStream op = response.getOutputStream();
op.write(data, 0, data.length);
op.close();
op = null;
response.flushBuffer();
//清除輸出流,防止釋放時(shí)被捕獲異常
out.clear();
out = pageContext.pushBody();
}
%>
5. OracleQueryBean查詢類的整體代碼
OracleQueryBean.java文件代碼如下所示:
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驅(qū)動(dòng)失敗,原因:" + ex.getMessage());
}
}
public Connection getConnection(){
try{
//用戶名+密碼; 以下使用的Test就是Oracle里的表空間
//從配置文件中讀取數(shù)據(jù)庫(kù)信息
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("請(qǐng)檢測(cè)配置文件中的數(shù)據(jù)庫(kù)信息是否正確." );
}
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("獲取圖片數(shù)據(jù)失敗,原因:" + 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("獲取圖片數(shù)據(jù)失敗,原因:" + 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);
//轉(zhuǎn)換成byte字節(jié)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bid, "jpeg", baos);
newdata = baos.toByteArray();
}catch(IOException e){
e.printStackTrace();
}
return newdata;
}
}
下面是我的存儲(chǔ)讀取blob圖片的案例
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, "測(cè)試圖片");
pstmt.executeUpdate();
fis.close();
pstmt.close();
con.close();
}
}
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中配置
<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>
希望本文所述對(duì)大家的Java程序設(shè)計(jì)有所幫助。
相關(guān)文章
java yaml轉(zhuǎn)properties工具類方式
這篇文章主要介紹了java yaml轉(zhuǎn)properties工具類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10spring boot Rabbit高級(jí)教程(最新推薦)
RabbitMQ的消息過期是基于追溯方式來(lái)實(shí)現(xiàn)的,也就是說(shuō)當(dāng)一個(gè)消息的TTL到期以后不一定會(huì)被移除或投遞到死信交換機(jī),而是在消息恰好處于隊(duì)首時(shí)才會(huì)被處理,本篇文章給大家介紹spring boot Rabbit高級(jí)教程,感興趣的朋友一起看看吧2023-10-10rabbitmq五種模式詳解(含實(shí)現(xiàn)代碼)
這篇文章主要介紹了rabbitmq五種模式詳解(含實(shí)現(xiàn)代碼),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04簡(jiǎn)單理解遵循接口隔離原則的Java設(shè)計(jì)模式編程
這篇文章主要介紹了遵循接口隔離原則的Java設(shè)計(jì)模式編程,針對(duì)Java編程中interface接口方面的編寫進(jìn)行約束,需要的朋友可以參考下2016-02-02簡(jiǎn)單了解java集合框架LinkedList使用方法
這篇文章主要介紹了簡(jiǎn)單了解java集合框架LinkedList使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟
這篇文章主要介紹了springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-05-05使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)映射的方式
這篇文章主要介紹了使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)映射的方式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10