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

      <small id="aebxz"><menu id="aebxz"></menu></small>
    1. 講解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