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

近期,在给客户做一个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。

下载地址为:

下载了驱动之后,可以使用驱动里提供的接口进行连接,具体代码如下:

importjava.sql.*;

importjava.io.*;

importjavax.imageio.ImageIO;

importjava.awt.image.BufferedImage;

importjava.awt.image.AffineTransformOp;

importjava.awt.geom.AffineTransform;

publicclassOracleQueryBean {

privatefinalStringoracleDriverName="oracle.jdbc.driver.OracleDriver";

privateConnectionmyConnection=null;

/*图片表名*/

privateStringstrTabName;

/*图片ID字段名*/

privateStringstrIDName;

/*图片字段名*/

privateStringstrImgName;

/**

*加载java连接Oracle的jdbc驱动

*/

publicOracleQueryBean(){

try{

Class.forName(oracleDriverName);

}catch(ClassNotFoundException ex){

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

}

}

/**

*获取Oracle连接对象

*@returnConnection

*/

publicConnection getConnection(){

try{

//用户名+密码;以下使用的Test就是Oracle里的表空间

//从配置文件中读取数据库信息

GetPara

oGetPara =newGetPara();

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,intw,inth){

//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 =newStringBuffer();

if(myResultSet.next()) {

java.sql.Blob blob = myResultSet.getBlob(this.strImgName);

InputStream inStream = blob.getBinaryStream();

try{

longnLen = blob.length();

intnSize = (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());

}

returndata;

}

3.缩放图片

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

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

/**

*缩小或放大图片

*@paramdata图片的byte数据

*@paramw需要缩到的宽度

*@paramh需要缩到高度

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

*/

privatebyte[] ChangeImgSize(byte[] data,intnw,intnh){

byte[] newdata =null;

try{

BufferedImage

bis = ImageIO.read(newByteArrayInputStream(data));

intw = bis.getWidth();

inth = bis.getHeight();

doublesx = (double) nw / w;

doublesy = (double) nh / h;

AffineTransform transform =newAffineTransform();

transform.setToScale(sx, sy);

AffineTransformOp ato =newAffineTransformOp(transform,null);

//原始颜色

BufferedImage bid =newBufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);

ato.filter(bis, bid);

//转换成byte字节

ByteArrayOutputStream baos =newByteArrayOutputStream();

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

newdata = baos.toByteArray();

}catch(IOException

e){

e.printStackTrace();

}

returnnewdata;

}

4.展示在页面

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

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

intnWith = Integer.parseInt(strWidth);

intnHeight = 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文件代码如下所示:

importjava.sql.*;

importjava.io.*;

importjavax.imageio.ImageIO;

importjava.awt.image.BufferedImage;

importjava.awt.image.AffineTransformOp;

importjava.awt.geom.AffineTransform;

publicclassOracleQueryBean {

privatefinalStringoracleDriverName="oracle.jdbc.driver.OracleDriver";

privateConnectionmyConnection=null;

/*图片表名*/

privateStringstrTabName;

/*图片ID字段名*/

privateStringstrIDName;

/*图片字段名*/

privateStringstrImgName;

/**

*加载java连接Oracle的jdbc驱动

*/

publicOracleQueryBean(){

try{

Class.forName(oracleDriverName);

}catch(ClassNotFoundException ex){

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

}

}

/**

*获取Oracle连接对象

*@returnConnection

*/

publicConnection getConnection(){

try{

//用户名+密码;以下使用的Test就是Oracle里的表空间

//从配置文件中读取数据库信息

GetPara

oGetPara =newGetPara();

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,intw,inth){

//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 =newStringBuffer();

if(myResultSet.next()) {

java.sql.Blob blob = myResultSet.getBlob(this.strImgName);

InputStream inStream = blob.getBinaryStream();

try{

longnLen = blob.length();

intnSize = (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());

}

returndata;

}

/**

*根据图片在数据库中的ID进行读取,显示原始大小的图片

*@paramstrID图片字段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 =newStringBuffer();

if(myResultSet.next()) {

java.sql.Blob blob = myResultSet.getBlob(this.strImgName);

InputStream inStream = blob.getBinaryStream();

try{

longnLen = blob.length();

intnSize = (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());

}

returndata;

}

/**

*缩小或放大图片

*@paramdata图片的byte数据

*@paramw需要缩到的宽度

*@paramh需要缩到高度

*@return

*/

privatebyte[] ChangeImgSize(byte[] data,intnw,intnh){

byte[] newdata =null;

try{

BufferedImage

bis = ImageIO.read(newByteArrayInputStream(data));

intw = bis.getWidth();

inth = bis.getHeight();

doublesx = (double) nw / w;

doublesy = (double) nh / h;

AffineTransform transform =newAffineTransform();

transform.setToScale(sx, sy);

AffineTransformOp ato =newAffineTransformOp(transform,null);

//原始颜色

BufferedImage bid =newBufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);

ato.filter(bis, bid);

//转换成byte字节

ByteArrayOutputStream baos =newByteArrayOutputStream();

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

newdata = baos.toByteArray();

}catch(IOException

e){

e.printStackTrace();

}

returnnewdata;

}

}

java oracle 图片_JAVA读取Oracle中的blob图片字段并显示相关推荐

  1. java pdf 水印_Java 在PDF中添加水印——文本/图片水印

    水印是一种十分常用的防伪手段,常用于各种文档.资料等.常见的水印,包括文字类型的水印.图片或logo类型的水印.以下java示例,将分别使用inserttextwatermark(pdfpagebas ...

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

    转自:http://www.blogjava.net/zhangqingping/articles/JAVA.html 近期,在给客户做一个Demo页面时,需要用JAVA读取Oracle中的blob图 ...

  3. Java利用Apace POI读取Excel中数据

    Java利用Apace POI读取Excel中数据,解析数据 @Testpublic void readExcel() throws IOException{FileSystemView fsv = ...

  4. 如何录制gif动态图片并在CSDN中插入动态图片

    我们在网上浏览别人的博客时,经常可以看到以gif动态图显示的程序效果演示和代码段,那么如何录制gif动态图片并在CSDN中插入动态图片呢?        下面介绍一种简单的方法,了解之后,你也可以将其 ...

  5. java解析pdf 图片文字_Java 读取PDF中的文本和图片

    本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法.分别调用方法extractText()和extractImages()来读取. 使用工具:Free Spire.PDF for Java ...

  6. java照片拍摄时间_java读取图片的(尺寸、拍摄日期、标记)等EXIF信息

    主要代码如下: package com.test; import java.io.File; import java.io.IOException; import java.util.Iterator ...

  7. java ftp读取文件内容_java读取ftp中TXT文件的案例

    最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录 1.读取文件时我会根据文件名称去生成数据库表,oracle数据库对于表名的长度是有限制的,最多30个字符 2.对于多个文 ...

  8. java连接本地oracle数据库_JAVA连接oracle数据库的三种方式

    1 传统方式连接数据库(效率较低) 此方法连接数据库,其性能.可靠性与稳定性随着用户访问量的增加逐渐下降,跟踪测试表明,其根本问题与Connection对象的创建有关.不过在这里还是讲一下此方法的实现 ...

  9. java调用oracle存储过程_java调用oracle存储过程详解

    之前给大家介绍了java代码调用存储过程,下面要给大家介绍的就是java当中调用oracle存储过程,一起来看看吧. 首先来看一下项目结构: 在数据库创建存储过程的脚本,假如,使用的是本地的oracl ...

最新文章

  1. 取消掉Transfer-Encoding:chunked
  2. Batch Normalization的诅咒
  3. 动态编译真有用武之地?
  4. 规格参数查询后台代码实现
  5. 云计算和并行计算的关系
  6. Difference between RawValue and FormattedValue
  7. 想跟着微软赛跑会累死你
  8. 最难面试IT公司的测试题
  9. 生成网站缩略图代码(C#)
  10. 网络学习(三十三)Windows Server 2003 DFS(分布式文件系统)
  11. sql语句:CASE WHEN END 的用法
  12. 【毕业设计/Matlab系列】基于matlab的线性调频信号的仿真
  13. 点餐系统ip地址_教你一步一步做无线点餐项目(登录篇)
  14. 人工智能的现状与未来(附PPT)
  15. 故障效果,制作抖音效果的幻影海报
  16. 神经网络中BP算法的推导
  17. Mitmproxy代理工具(一):环境配置
  18. 人性歪曲的心理调适 一【抑郁心理、烦恼心理、懊悔心理、焦虑心理、恐惧心理】...
  19. 红队 入门_我穿越网络安全红队的硕士证书的旅程
  20. 【Hexo搭建个人博客】(十三)Next主题中添加首页文章置顶功能及置顶图标

热门文章

  1. 怎么用python画心_python怎么画心Python的类实例属性访问规则
  2. centos恢复图形界面_centos7安装图形界面
  3. linux xampp nginx,nginx配置教程_如何配置nginx_nginx安装与配置详解
  4. 知乎高赞:本科生如何才能进入腾讯、阿里等一流互联网大厂?
  5. 小长假来了,送 40 本 Python 好书
  6. android修改xml变量值,Android中XML的基本操作(增、删、改、查)
  7. matlab白噪音wav,通过matlab产生wav的白噪声.pdf
  8. python asyncio理解_我实在不懂Python的Asyncio
  9. uniapp实战项目仿糗事百科_项目设计最好用的底层思考模型——黄金圈
  10. java类怎么实例化_Java类的定义及其实例化