久久综合丝袜日本网手机版,日韩欧美中文字幕在线三区,亚洲精品国产品国语在线,极品在线观看视频婷婷

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

        • 相關(guān)推薦

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

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

          第一種方法:

          大致方法就是,從數(shù)據(jù)庫中讀出Blob的流來,寫到頁面中去:

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

          }

          在頁面中:

          復(fù)制代碼 代碼如下:<%

          String path = request.getContextPath();

          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

          %>

          

          搞定。

          第二種方法:

          整個流程分為四步,連接oracle數(shù)據(jù)庫 -> 讀取blob圖片字段 -> 對圖片進(jìn)行縮放 ->把圖片展示在jsp頁面上。

          復(fù)制代碼 代碼如下: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驅(qū)動失敗,原因:" + 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ù),來進(jìn)行讀取,具體代碼如下:

          復(fù)制代碼 代碼如下: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. 縮放圖片

          因?yàn)閳D片的大小可能不一致,但是在頁面中輸出的大小需要統(tǒng)一,所以需要

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

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

          }

          4. 展示在頁面

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

          復(fù)制代碼 代碼如下:<%@ 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文件代碼如下所示:

          復(fù)制代碼 代碼如下: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驅(qū)動失敗,原因:" + 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);

          //轉(zhuǎn)換成byte字節(jié)

          ByteArrayOutputStream baos = new ByteArrayOutputStream();

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

          newdata = baos.toByteArray();

          }catch(IOException e){

          e.printStackTrace();

          }

          return newdata;

          }

          }

          下面是我的存儲讀取blob圖片的案例

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

          }

          }

          復(fù)制代碼 代碼如下: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顯示

          復(fù)制代碼 代碼如下:

          web.xml中配置

          復(fù)制代碼 代碼如下:

          genImage

          ReadPhoto

          

          

          genImage

          /genImage

          

          希望本文所述對大家的Java程序設(shè)計有所幫助。

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

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

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

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

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

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

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

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

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

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

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