1.2.3 Java 는 Oracle 의 blob 그림 필드 를 읽 고 표시 합 니 다.

12557 단어 1.2JAVA
최근 에 고객 에 게 데모 페이지 를 만 들 때 JAVA 로 Oracle 의 blob 이미지 필드 를 읽 고 표시 해 야 합 니 다.이 과정 에서 일부 문제 가 발생 했 습 니 다.예 를 들 어 Oracle 데이터 베 이 스 를 연결 하여 blob 필드 데 이 터 를 읽 고 이미지 byte 데 이 터 를 확대 하 는 등 입 니 다.특별히 이 기록 은 자신 에 게 잊 어 버 리 고 모두 에 게 참고 하도록 하 겠 습 니 다.
전체 프로 세 스 는 4 단계 로 나 뉘 어 Oacle 데이터 베 이 스 를 연결 합 니 다. -> blob 그림 필드 읽 기 -> 그림 크기 조정 ->그림 을 jsp 페이지 에 전시 하 다.
아래 에 상세 한 설명 을 하 겠 습 니 다.
1. 자바 연결 Oracle
주:데이터 베 이 스 는 Oracle 10g 버 전 10.2.0 입 니 다. 데이터베이스 에서 그림 필드 형식 은 BLOB 입 니 다.
 자바 에 서 는 일반적으로 jdbc 구동 을 통 해 데이터 베 이 스 를 연결 하 는 것 을 사용 합 니 다.Oacle 도 예외 가 아 닙 니 다.따라서 Oracle 구동 jdbc 를 다운로드 하려 면 인터넷 에서 다운로드 해 야 합 니 다.이름 은? ojdbc14.jar。
다운로드 주소:
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101040.html
 드라이버 를 다운로드 한 후 드라이버 에서 제공 하 는 인 터 페 이 스 를 사용 하여 연결 할 수 있 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
 
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;
    /*  ID   */
    private String strIDName;
    /*     */
    private String strImgName;
    /**
     *   java  Oracle jdbc  
     */
    public OracleQueryBean(){
        try{
            Class.forName(oracleDriverName);
        }catch(ClassNotFoundException ex){
            System.out.println("  jdbc    ,  :" + ex.getMessage());
        }
    }
    /**
     *   Oracle    
     * @return Connection
     */
    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 필드 읽 기
Oracle QueryBean 클래스 에 함 수 를 추가 하여 읽 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
 
/**
     *           ID    
     * @param strID      ID
     * @param w             
     * @param h            
     * @return
     */
    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. 그림 크기 조정
그림 의 크기 가 일치 하지 않 을 수 있 지만 페이지 에서 출력 하 는 크기 는 통일 되 어야 하기 때문에 필요 합 니 다.
Oracle Query Bean 클래스 에 함 수 를 추가 하여 크기 를 조정 합 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
 
/**
     *        
     * @param data      byte  
     * @param w             
     * @param h            
     * @return              byte  
     */
    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. 페이지 에 전시
페이지 는 Oracle QueryBean 을 사용 하여 사용자 가 제공 한 이미지 id 에 따라 조회 하고 읽 고 크기 를 조정 한 후 jsp 페이지 를 통 해 보 여 줍 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
 



 
 
5. Oracle Query Bean 조회 류 의 전체 코드
Oracle QueryBean.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;
    /*  ID   */
    private String strIDName;
    /*     */
    private String strImgName;
    /**
     *   java  Oracle jdbc  
     */
    public OracleQueryBean(){
        try{
            Class.forName(oracleDriverName);
        }catch(ClassNotFoundException ex){
            System.out.println("  jdbc    ,  :" + ex.getMessage());
        }
    }
    /**
     *   Oracle    
     * @return Connection
     */
    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;
    }
    /**
     *           ID    
     * @param strID      ID
     * @param w             
     * @param h            
     * @return              byte  
     */
    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;
    }
   
    /**
     *           ID    ,         
     * @param    strID       ID
     * @return         byte  
     */
    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;
    }
   
    /**
     *        
     * @param data      byte  
     * @param w             
     * @param h            
     * @return
     */
    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;
    }
}

 
 
 
 
 

좋은 웹페이지 즐겨찾기