97超级碰碰碰久久久_精品成年人在线观看_精品国内女人视频免费观_福利一区二区久久

講解Java從數(shù)據(jù)庫中讀取Blob對象圖片并顯示的方法

  • 相關推薦

講解Java從數(shù)據(jù)庫中讀取Blob對象圖片并顯示的方法

  本文實例講述了Java從數(shù)據(jù)庫中讀取Blob對象圖片并顯示的方法。分享給大家供大家參考。具體實現(xiàn)方法如下:

  第一種方法:

  大致方法就是,從數(shù)據(jù)庫中讀出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數(shù)據(jù)庫 -> 讀取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里的表空間

  //從配置文件中讀取數(shù)據(jù)庫信息

  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("請檢測配置文件中的數(shù)據(jù)庫信息是否正確." );

  }

  return this.myConnection;

  }

  }

  2. 讀取blob字段

  在OracleQueryBean類中增加一個函數(shù),來進行讀取,具體代碼如下:

  復制代碼 代碼如下: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;

  }

  3. 縮放圖片

  因為圖片的大小可能不一致,但是在頁面中輸出的大小需要統(tǒng)一,所以需要

  在OracleQueryBean類中增加一個函數(shù),來進行縮放,具體代碼如下:

  復制代碼 代碼如下: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字節(jié)

  ByteArrayOutputStream baos = new ByteArrayOutputStream();

  ImageIO.write(bid, "jpeg", baos);

  newdata = baos.toByteArray();

  }catch(IOException e){

  e.printStackTrace();

  }

  return newdata;

  }

  4. 展示在頁面

  頁面使用OracleQueryBean來根據(jù)用戶提供的圖片id進行查詢,在讀取并進行縮放后,通過jsp頁面進行展示,具體代碼如下:

  復制代碼 代碼如下:<%@ page="" language="java" contenttype="text/html;;charset=gbk">

  

  <%

  response.setContentType("image/jpeg");

  //圖片在數(shù)據(jù)庫中的 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();

  //清除輸出流,防止釋放時被捕獲異常

  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里的表空間

  //從配置文件中讀取數(shù)據(jù)庫信息

  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("請檢測配置文件中的數(shù)據(jù)庫信息是否正確." );

  }

  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);

  //轉換成byte字節(jié)

  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程序設計有所幫助。

【講解Java從數(shù)據(jù)庫中讀取Blob對象圖片并顯示的方法】相關文章:

使用Java程序連接各種數(shù)據(jù)庫的方法07-01

java面試題:文件讀取問題.07-13

電腦的硬盤無法讀取顯示I/O設備錯誤07-02

java數(shù)據(jù)庫面試題07-13

關于數(shù)據(jù)庫中跨平臺遷移方法介紹06-28

互聯(lián)網(wǎng)數(shù)據(jù)庫考點講解06-28

主要C#,JAVA,數(shù)據(jù)庫,簡歷中的專業(yè)能力怎么寫較好?07-11

解析android中隱藏與顯示軟鍵盤的實現(xiàn)方法07-04

收縮SQL數(shù)據(jù)庫的方法06-28

實例講解Ruby使用設計模式中的裝飾器模式的方法參考06-29