JAVA读取Oracle中的blob图片字段并显示

来源:互联网 发布:爱青岛网络公开课 编辑:程序博客网 时间:2024/04/30 06:46

近期,在给客户做一个Demo页面时,需要用JAVA读取Oracle中的blob图片字段并显示,在此过程中,遇到一些问题,例如:连接Oracle数据库读取blob字段数据,对图片byte数据进行缩放等;特此记录,给自己备忘,给大家参考。

 

整个流程分为四步,连接oracle数据库 -> 读取blob图片字段 -> 对图片进行缩放 ->把图片展示在jsp页面上。

下面进行详细描述:

1. java连接Oracle

注:数据库是Oracle10g版本为10.2.0, 在数据库中,图片字段类型为BLOB。

 

java中通常使用的是通过jdbc驱动来连接数据库,oracle也不例外,因此必须下载一个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;

 

publicclass OracleQueryBean {

   privatefinal StringoracleDriverName ="oracle.jdbc.driver.OracleDriver";

   private ConnectionmyConnection =null;

   /*图片表名*/

   private StringstrTabName;

   /*图片ID字段名*/

   private StringstrIDName;

   /*图片字段名*/

   private StringstrImgName;

   /**

    *加载java连接Oraclejdbc驱动

    */

   public OracleQueryBean(){

       try{

            Class.forName(oracleDriverName);

        }catch(ClassNotFoundException ex){

            System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage());

        }

    }

   /**

    *获取Oracle连接对象

    *@returnConnection

    */

   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("请检测配置文件中的数据库信息是否正确." );

        }

       returnthis.myConnection;

    }

}

 

2. 读取blob字段

 

在OracleQueryBean类中增加一个函数,来进行读取,具体代码如下:

/**

    *根据图片在数据库中的ID进行读取

    *@paramstrID 图片字段ID

    *@paramw     需要缩到的宽度

    *@paramh     需要缩到高度

    *@return

    */

   publicbyte[] 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 =newbyte[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. 缩放图片

因为图片的大小可能不一致,但是在页面中输出的大小需要统一,所以需要

在OracleQueryBean类中增加一个函数,来进行缩放,具体代码如下:

/**

    *缩小或放大图片

    *@paramdata  图片的byte数据

    *@paramw     需要缩到的宽度

    *@paramh     需要缩到高度

    *@return      缩放后的图片的byte数据

    */

   privatebyte[] 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. 展示在页面

页面使用OracleQueryBean来根据用户提供的图片id进行查询,在读取并进行缩放后,通过jsp页面进行展示,具体代码如下:

 

<%@pagelanguage="java"contentType="text/html;;charset=gbk"%>

<jsp:useBeanid="OrcleQuery"scope="page"class="HLFtiDemo.OracleQueryBean"/>

<%

    response.setContentType("image/jpeg");

   //图片在数据库中的 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数据

        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;

 

publicclass OracleQueryBean {

   privatefinal StringoracleDriverName ="oracle.jdbc.driver.OracleDriver";

 

   private ConnectionmyConnection =null;

   

   /*图片表名*/

   private StringstrTabName;

   /*图片ID字段名*/

   private StringstrIDName;

   /*图片字段名*/

   private StringstrImgName;

   /**

     *加载java连接Oraclejdbc驱动

    */

   public OracleQueryBean(){

       try{

            Class.forName(oracleDriverName);

        }catch(ClassNotFoundException ex){

            System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage());

        }

    }

   /**

    *获取Oracle连接对象

    *@returnConnection

    */

   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("请检测配置文件中的数据库信息是否正确." );

        }

       returnthis.myConnection;

    }

   /**

    *根据图片在数据库中的ID进行读取

    *@paramstrID 图片字段ID

    *@paramw     需要缩到的宽度

    *@paramh     需要缩到高度

    *@return      缩放后的图片的byte数据

    */

   publicbyte[] 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 =newbyte[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数据

    */

   publicbyte[] 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 =newbyte[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;

    }

   

   /**

    *缩小或放大图片

     *@paramdata  图片的byte数据

    *@paramw     需要缩到的宽度

    *@paramh     需要缩到高度

    *@return

    */

   privatebyte[] 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;

    }

}

原创粉丝点击