java oracle 图片_JAVA读取Oracle中的blob图片字段并显示
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图片字段并显示相关推荐
- java pdf 水印_Java 在PDF中添加水印——文本/图片水印
水印是一种十分常用的防伪手段,常用于各种文档.资料等.常见的水印,包括文字类型的水印.图片或logo类型的水印.以下java示例,将分别使用inserttextwatermark(pdfpagebas ...
- JAVA读取Oracle中的blob图片字段并显示
转自:http://www.blogjava.net/zhangqingping/articles/JAVA.html 近期,在给客户做一个Demo页面时,需要用JAVA读取Oracle中的blob图 ...
- Java利用Apace POI读取Excel中数据
Java利用Apace POI读取Excel中数据,解析数据 @Testpublic void readExcel() throws IOException{FileSystemView fsv = ...
- 如何录制gif动态图片并在CSDN中插入动态图片
我们在网上浏览别人的博客时,经常可以看到以gif动态图显示的程序效果演示和代码段,那么如何录制gif动态图片并在CSDN中插入动态图片呢? 下面介绍一种简单的方法,了解之后,你也可以将其 ...
- java解析pdf 图片文字_Java 读取PDF中的文本和图片
本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法.分别调用方法extractText()和extractImages()来读取. 使用工具:Free Spire.PDF for Java ...
- java照片拍摄时间_java读取图片的(尺寸、拍摄日期、标记)等EXIF信息
主要代码如下: package com.test; import java.io.File; import java.io.IOException; import java.util.Iterator ...
- java ftp读取文件内容_java读取ftp中TXT文件的案例
最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录 1.读取文件时我会根据文件名称去生成数据库表,oracle数据库对于表名的长度是有限制的,最多30个字符 2.对于多个文 ...
- java连接本地oracle数据库_JAVA连接oracle数据库的三种方式
1 传统方式连接数据库(效率较低) 此方法连接数据库,其性能.可靠性与稳定性随着用户访问量的增加逐渐下降,跟踪测试表明,其根本问题与Connection对象的创建有关.不过在这里还是讲一下此方法的实现 ...
- java调用oracle存储过程_java调用oracle存储过程详解
之前给大家介绍了java代码调用存储过程,下面要给大家介绍的就是java当中调用oracle存储过程,一起来看看吧. 首先来看一下项目结构: 在数据库创建存储过程的脚本,假如,使用的是本地的oracl ...
最新文章
- 取消掉Transfer-Encoding:chunked
- Batch Normalization的诅咒
- 动态编译真有用武之地?
- 规格参数查询后台代码实现
- 云计算和并行计算的关系
- Difference between RawValue and FormattedValue
- 想跟着微软赛跑会累死你
- 最难面试IT公司的测试题
- 生成网站缩略图代码(C#)
- 网络学习(三十三)Windows Server 2003 DFS(分布式文件系统)
- sql语句:CASE WHEN END 的用法
- 【毕业设计/Matlab系列】基于matlab的线性调频信号的仿真
- 点餐系统ip地址_教你一步一步做无线点餐项目(登录篇)
- 人工智能的现状与未来(附PPT)
- 故障效果,制作抖音效果的幻影海报
- 神经网络中BP算法的推导
- Mitmproxy代理工具(一):环境配置
- 人性歪曲的心理调适 一【抑郁心理、烦恼心理、懊悔心理、焦虑心理、恐惧心理】...
- 红队 入门_我穿越网络安全红队的硕士证书的旅程
- 【Hexo搭建个人博客】(十三)Next主题中添加首页文章置顶功能及置顶图标
热门文章
- 怎么用python画心_python怎么画心Python的类实例属性访问规则
- centos恢复图形界面_centos7安装图形界面
- linux xampp nginx,nginx配置教程_如何配置nginx_nginx安装与配置详解
- 知乎高赞:本科生如何才能进入腾讯、阿里等一流互联网大厂?
- 小长假来了,送 40 本 Python 好书
- android修改xml变量值,Android中XML的基本操作(增、删、改、查)
- matlab白噪音wav,通过matlab产生wav的白噪声.pdf
- python asyncio理解_我实在不懂Python的Asyncio
- uniapp实战项目仿糗事百科_项目设计最好用的底层思考模型——黄金圈
- java类怎么实例化_Java类的定义及其实例化