【转】Oracle中插入和取出图片(用BLOB类型)
原文地址:http://czllfy.iteye.com/blog/66737
其他参考资料地址:http://lavasoft.blog.51cto.com/62575/321882/
要在oracle里面存入图片 用 blob类型
首先在数据库里建立:
--连接到管理员
conn sys/tbsoft as sysdba;
--为scott用户授权
grant create any directory to scott;
--回到scott用户
conn scott/tiger;
--创建存储图片的表
CREATE TABLE IMAGE_LOB (T_ID VARCHAR2 (5) NOT NULL,T_IMAGE BLOB NOT NULL);
--创建存储图片的目录
CREATE OR REPLACE DIRECTORY IMAGES AS 'C:\picture';
--在c:下自己建一个叫picture的文件夹
CREATE OR REPLACE PROCEDURE IMG_INSERT (TID VARCHAR2,FILENAME VARCHAR2) AS
F_LOB BFILE;--文件类型
B_LOB BLOB;
BEGIN
iNSERT INTO IMAGE_LOB (T_ID, T_IMAGE)
VALUES (TID,EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB;
--插入空的blob
F_LOB:= BFILENAME ('IMAGES', FILENAME);
--获取指定目录下的文件
DBMS_LOB.FILEOPEN(F_LOB, DBMS_LOB.FILE_READONLY);
--以只读的方式打开文件
DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB,DBMS_LOB.GETLENGTH (F_LOB));
--传递对象
DBMS_LOB.FILECLOSE (F_LOB);
--关闭原始文件
COMMIT;
END;
/
--在C:\picture下放一张图片1.gif
--将该图片存入表
call IMG_INSERT('1','1.gif');
然后创建一个web项目 连接数据库后 创建一个BlobDAO类 用来取出表中的blob类型图片
public class BlobDAO {
private static final BlobDAO instance = new BlobDAO();
private Connection conn = null;
private BlobDAO() {
}
public static BlobDAO getInstance() {
return instance;
}
private void initConn() {
conn = DBAccess.getInstance().getConn();
}
public byte[] getImage(String imgname) {
BufferedInputStream ins;//取得BLOB的IO流
byte[] bt = null;
initConn();
Blob bo = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select T_IMAGE from IMAGE_LOB where t_id=?";
try {
ps = conn.prepareStatement(sql);
ps.setString(1, imgname);
rs = ps.executeQuery();
if (rs.next()) {
bo = rs.getBlob("T_IMAGE");
try {
ins = new BufferedInputStream(bo.getBinaryStream());
int bufferSize = (int) bo.length();//取得BLOB的长度
bt = new byte[bufferSize];
try {
ins.read(bt, 0, bufferSize);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//建立字节缓存
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return bt;
}
}
在action里面调用getImage()方法并显示图片在页面上
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
BlobDAO blobDAO = BlobDAO.getInstance();
byte[] bs = blobDAO.getImage("1");
try {
response.getOutputStream().write(bs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
添加图片到数据库
请在c盘下放入图片--c:\\4.gif
public void savaImg(String imgId) {
//传的是存入数据库图片的id
initConn();
Statement st = null;
BLOB blob = null; //图片类型
OutputStream outputStream = null; //输出流
File file = null; //文件
InputStream inputStream = null; //输入流
ResultSet rs = null;
try {
conn.setAutoCommit(false); //事物由程序员操作
st = conn.createStatement();
st.executeQuery("insert into IMAGE_LOB values('"+ imgId +"',empty_blob())");
rs = st.executeQuery("select T_IMAGE from IMAGE_LOB where t_id='"+ imgId +"' for update");
if (rs.next()) {
blob = (BLOB) rs.getBlob(1);
outputStream = blob.getBinaryOutputStream();
file = new File("c:\\4.gif");
inputStream = new FileInputStream(file);
byte[] b = new byte[blob.getBufferSize()];
int len = 0;
while ((len = inputStream.read(b)) != -1) {
System.out.println(len);
outputStream.write(b, 0, len);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
inputStream.close();
outputStream.flush();
outputStream.close();
rs.close();
st.close();
conn.commit();
conn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Java在postgresql中插入和读取图片
原文:http://blog.csdn.net/movture/article/details/8782402
注意:
① 此例中postgresql 用byeta类型的字段保存图片。
② JAVA代码第71行,setBinaryStream 方法第三个参数需要是整数型。若没有参数或参数被设置为长整型,虽然编译会通过,但执行会出错。
JAVA代码
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- public class PostgresTest {
- private Connection conn = null;
- private PreparedStatement ps = null;
- private final String driver = "org.postgresql.Driver";
- private final String ip = "127.0.0.1";
- private final String port = "5432";
- private final String database_name = "test";
- private final String user = "postgres";
- private final String password = "123456";
- public PostgresTest() {
- try {
- this.getConnection();
- System.out.println("数据库 " + ip + "/" + database_name + " 连接成功");
- } catch (ClassNotFoundException e) {
- System.err.println("没有找到驱动程序:" + driver);
- } catch (SQLException e) {
- System.err.println("数据库 " + ip + "/" + database_name + " 连接失败");
- }
- }
- /**
- * 获得数据库连接
- *
- * @return 数据库连接
- * @throws ClassNotFoundException
- * @throws SQLException
- */
- private Connection getConnection() throws ClassNotFoundException,
- SQLException {
- Class.forName(driver);
- conn = DriverManager.getConnection("jdbc:postgresql://" + ip + ":"
- + port + "/" + database_name, user, password);
- return conn;
- }
- /**
- * 向数据库上传图片
- *
- * @param path
- * @param name
- */
- public void uploadImage(String path, String name) {
- String sql = "insert into notice_image(image_name,image_file) values(?,?)";
- try {
- ps = conn.prepareStatement(sql);
- // 设置图片名称
- ps.setString(1, name);
- // 设置图片文件
- File file = new File(path + "\\" + name);
- FileInputStream inputStream = new FileInputStream(file);
- ps.setBinaryStream(2, inputStream, (int) file.length());
- // 执行SQL
- ps.execute();
- ps.close();
- System.out.println(path + "\\" + name+" 已上传");
- } catch (SQLException e) {
- System.err.println("SQL " + sql + " 错误");
- } catch (FileNotFoundException e) {
- System.err.println("图片 " + path + "\\" + name + " 没有找到");
- }
- }
- /**
- * 从数据库下载图片
- *
- * @param path
- */
- public void downloadImage(String path) {
- String sql = "SELECT image_name,image_file FROM notice_image";
- String name = "";
- try {
- ps = conn.prepareStatement(sql);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- name = rs.getString(1);
- InputStream inputStream = rs.getBinaryStream(2);
- FileOutputStream outputStream = new FileOutputStream(new File(
- path + "\\_" + name));
- int i = inputStream.read();
- while (i != -1) {
- outputStream.write(i);
- i = inputStream.read();
- }
- outputStream.close();
- System.out.println(path + "\\_" + name + " 已下载");
- }
- rs.close();
- ps.close();
- } catch (SQLException e) {
- System.err.println("SQL " + sql + " 错误");
- } catch (FileNotFoundException e) {
- System.err.println(path + "\\_" + name + " 创建失败");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- PostgresTest o = new PostgresTest();
- o.uploadImage("d:", "23.jpg");
- o.uploadImage("d:", "24.jpg");
- o.downloadImage("d:");
- }
- }
Postgres建表SQL
- -- Table: notice_image
- -- DROP TABLE notice_image;
- CREATE TABLE notice_image
- (
- id serial NOT NULL,
- image_name character varying(256) NOT NULL DEFAULT ''::character varying,
- image_file bytea,
- CONSTRAINT pk_notice_image PRIMARY KEY (id)
- )
- WITH (OIDS=FALSE);
- ALTER TABLE notice_image OWNER TO postgres;
【转】Oracle中插入和取出图片(用BLOB类型)的更多相关文章
- 如何在latex 中插入EPS格式图片
如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...
- for循环往Oracle中插入n条数据,主键自增
1.主键自增实现方法:http://www.cnblogs.com/Donnnnnn/p/5959871.html 2.for循环往Oracle中插入n条数据 BEGIN .. loop insert ...
- MyBatis在Oracle中插入数据并返回主键的问题解决
引言: 在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle. Spring 3.2 SQL Snipp ...
- 向oracle中插入date时,持久层sql怎么写???
public class EmpDao { public void addEmp(Emp emp) throws SQLException { QueryRunner runner = new Que ...
- C# Word文档中插入、提取图片,文字替换图片
Download Files:ImageOperationsInWord.zip 简介 在这篇文章中我们可以学到在C#程序中使用一个Word文档对图像的各种操作.图像会比阅读文字更有吸引力,而且图像是 ...
- Oracle中插入100万条数据
在做项目的工程中,需要数据库中存在大量的数据进行程序的验证,但是我们又没有数据,这时就需要我们自己手动建一个表,插入大量数据,进行验证. 那么插入大量数据的sql语句如下: insert into E ...
- 向Oracle中插入记录时,出现“Oracle.DataAccess.Client.OracleException ORA-00933 ”错误
错误信息的弹出框
- log4j向oracle中插入一条系统当前时间的sql语句
配置log4j,要向oracle插入一条系统当前时间的sql语句,按网上查找的总是出现各种各样的报错,最后总结出的写法是: ### shezhi### log4j.rootLogger = debug ...
- hibernate在Oracle中插入数据,默认字段被设置为null的问题解决
参考内容: http://blog.sina.cn/dpool/blog/s/blog_90629d5301014a5w.html 在数据库中一个字段的默认值为1,但是在插入数据后,本来该字段为空,值 ...
随机推荐
- Cookies with curl the command line tool
w https://curl.haxx.se/docs/http-cookies.html curl has a full cookie "engine" built in. If ...
- GPU instancing
参考 https://www.cnblogs.com/hont/p/7143626.html github地址 https://github.com/yingsz/instancing/ 补充2点: ...
- 关于在python manage.py createsuperuser时报django.db.utils.OperationalError: no such table: auth_user的解决办法
在stackflow上看到解决的办法是需要进行数据路的migrate:https://stackoverflow.com/questions/39071093/django-db-utils-oper ...
- python的语法规范及for和while
1.缩进: 空白在Python中是重要的.事实上行首的空白是重要的.它称为缩进.在逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次,从而用来决定语句的分组.这意味着同一层次的语句必须有相同的缩进 ...
- pgAgent设定定时备份
PostgreSQL定时自动备份 简介 PostgreSQL数据库中未提供数据库的定时备份功能,所以需要结合备份和定时job功能来共同实现. 这里我选取了2种定时job方式,crontab是Linux ...
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/musicvs/article/details/25368273 好吧.我真心全然搞不懂.我如今仅仅只 ...
- 《Python数据分析》笔记1 ——Numpy
Numpy数组 1.Numpy数组对象 Numpy中的多维数组称为ndarray,他有两个组成部分. 1.数据本身 2.描述数据的元数据 2.Numpy的数值类型 bool: 布尔型 inti:其长度 ...
- python 文件格式为 txt 转换成 csv 格式
1 txt 文件的读取 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=Tr ...
- Log level with log4j and Spark
Log Level Usages OFF This is the most specific, which allows no logging at all FATAL This is the mos ...
- hadoop05---进程线程
J2ee是一种规范,tomcat.jboss.weblogic就是实现.JMS是一种规范,ActiveMQ是实现. .1.1. 进程介绍.线程介绍 进程:它是内存中的一段独立的内存空间. 线程:是在进 ...