原文地址: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;