读取并显示oracle中的blob字段
1. java连接Oracle
具体代码如下:
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 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连接对象
*@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页面进行展示,具体代码如下:
<%@ page language=\"java\" contentType=\"text/html;;charset=gbk\" %>
<%
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 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连接对象
*@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;
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容
花图问答还为您提供以下相关内容希望对您有帮助:
oracle查看blob字段
使用函数 :Utl_Raw.Cast_To_Varchar2()例如:select Utl_Raw.Cast_To_Varchar2(t.content) from tb_message t 如果报错:需要修改sql为:select utl_raw.cast_to_varchar2(dbms_lob.substr(t.content,2000,1))from tb_message t
怎样用C#将oracle中读出的blob文件显示出来?
要显示的前提是:电脑上必须已经安装了可以浏览PDF的软件,例如: Adobe Reader,Foxit PDF Reader 等,并且这些软件启用了浏览器插件。然后,在ASPX.CS页面直接用 Response.ContentType = "application/pdf";Response.BinaryWrite( [blob内容] );就可以了 ...
oracle 查询哪个表有blob字段
这段SQL语句的作用是查询表TEST中所有BLOB类型的字段,以及它们所占的表空间大小。通过检查b.bytes字段,可以大致估算出BLOB字段占用的空间。需要注意的是,b.bytes字段可能并不完全准确,因为Oracle的表空间管理机制较为复杂,实际占用空间可能会有差异。此外,还可以使用DBMS_SPACE包中的API来获取更精确的...
如何在oracle中的blob字段下读取jpg格式文件保存
在Oracle数据库中处理BLOB字段时,读取并保存为JPG格式文件可通过特定步骤实现。借助于Toad工具,这一过程变得更为直观和便捷。首先,确保在数据库中存在包含BLOB数据的记录。BLOB(Binary Large Object)用于存储二进制大对象,如图像、音频文件等。此类型的数据在查询结果中通常以BLOB对象形式展示。接下来,...
oracle中如何查看一个表所占空间的大小, 这张表包含blob字段
在Oracle数据库中,查询包含Blob字段的表所占空间大小,可以使用以下SQL语句:select a.TABLESPACE_NAME "TableSpace Name", round(a.BYTES / 1024 / 1024) "MB Allocated", round((a.BYTES-nvl(b.BYTES, 0)) / 1024 / 1024) "MB Used", nvl(round(b.BYTES / 1024 / 1024), 0) "MB ...
如何读取Oracle的BLOB字段里的文件
楼主你好!根据你的描述,让我来给你回答!create table temp_blob as select &blob_colname from &tbname ;然后使用exp或者expdp 。或者你也可以使用第三方编程语言或者软件来导出。希望能帮到你,如果满意,请记得采纳哦~~~
如何读出oracle中的数据,图像
Bolb字段?还是只存储路径,如果只存储路径的话,读出路径放在标签就可以了 否则,需要当做流读取出来做处理,示例:开发人员可以在Blob对象上调用JDBC API中的方法,就像这些方法直接 在该对象所指向的SQL BLOB上执行操作一样。然而,如果想在BLOB数据上执行操作,就必须首先将BLOB数据物化到客户。Blob接口...
如何用Java和oracle实现BLOB字段的字符串读取
Java能够调用Oracle的存储过程,反之Oracle也能用Java来开发外部存储过程,这样Java和oracle的相互界限就已经不明确了。Oracle实现BLOB字段的字符串读取也就非常容易了。当然关系型数据库最好做自己应该做的事情而不是大包大揽做所有的非数据库应该做的事情。--开发Java类 --然后在Oracle中把这个类导入成为...
python如何保存从oracle数据库中读取的BLOB文件
import cx_Oracle con = cx_Oracle.connect(‘username’, ‘password’, ‘dsn’)blob_sql = "select column_name from table where clause"cursor = con.cursor()cursor.execute(blob_sql)result = cursor.fetchall()file = open('file_name', "wb")file.write(result[0][0].read()...
jdbc中如何处理OracleBLOB字段
就没问题,如果是二进制文件,传输就会有问题。根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:1.新建记录,插入BLOB数据 1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的: insert xxxtable(A,B,C) values(empty_blob()...