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

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.sql.Connection;
  8. import java.sql.DriverManager;
  9. import java.sql.PreparedStatement;
  10. import java.sql.ResultSet;
  11. import java.sql.SQLException;
  12. public class PostgresTest {
  13. private Connection conn = null;
  14. private PreparedStatement ps = null;
  15. private final String driver = "org.postgresql.Driver";
  16. private final String ip = "127.0.0.1";
  17. private final String port = "5432";
  18. private final String database_name = "test";
  19. private final String user = "postgres";
  20. private final String password = "123456";
  21. public PostgresTest() {
  22. try {
  23. this.getConnection();
  24. System.out.println("数据库 " + ip + "/" + database_name + " 连接成功");
  25. } catch (ClassNotFoundException e) {
  26. System.err.println("没有找到驱动程序:" + driver);
  27. } catch (SQLException e) {
  28. System.err.println("数据库 " + ip + "/" + database_name + " 连接失败");
  29. }
  30. }
  31. /**
  32. * 获得数据库连接
  33. *
  34. * @return 数据库连接
  35. * @throws ClassNotFoundException
  36. * @throws SQLException
  37. */
  38. private Connection getConnection() throws ClassNotFoundException,
  39. SQLException {
  40. Class.forName(driver);
  41. conn = DriverManager.getConnection("jdbc:postgresql://" + ip + ":"
  42. + port + "/" + database_name, user, password);
  43. return conn;
  44. }
  45. /**
  46. * 向数据库上传图片
  47. *
  48. * @param path
  49. * @param name
  50. */
  51. public void uploadImage(String path, String name) {
  52. String sql = "insert into notice_image(image_name,image_file) values(?,?)";
  53. try {
  54. ps = conn.prepareStatement(sql);
  55. // 设置图片名称
  56. ps.setString(1, name);
  57. // 设置图片文件
  58. File file = new File(path + "\\" + name);
  59. FileInputStream inputStream = new FileInputStream(file);
  60. ps.setBinaryStream(2, inputStream, (int) file.length());
  61. // 执行SQL
  62. ps.execute();
  63. ps.close();
  64. System.out.println(path + "\\" + name+" 已上传");
  65. } catch (SQLException e) {
  66. System.err.println("SQL " + sql + " 错误");
  67. } catch (FileNotFoundException e) {
  68. System.err.println("图片 " + path + "\\" + name + " 没有找到");
  69. }
  70. }
  71. /**
  72. * 从数据库下载图片
  73. *
  74. * @param path
  75. */
  76. public void downloadImage(String path) {
  77. String sql = "SELECT image_name,image_file FROM notice_image";
  78. String name = "";
  79. try {
  80. ps = conn.prepareStatement(sql);
  81. ResultSet rs = ps.executeQuery();
  82. while (rs.next()) {
  83. name = rs.getString(1);
  84. InputStream inputStream = rs.getBinaryStream(2);
  85. FileOutputStream outputStream = new FileOutputStream(new File(
  86. path + "\\_" + name));
  87. int i = inputStream.read();
  88. while (i != -1) {
  89. outputStream.write(i);
  90. i = inputStream.read();
  91. }
  92. outputStream.close();
  93. System.out.println(path + "\\_" + name + " 已下载");
  94. }
  95. rs.close();
  96. ps.close();
  97. } catch (SQLException e) {
  98. System.err.println("SQL " + sql + " 错误");
  99. } catch (FileNotFoundException e) {
  100. System.err.println(path + "\\_" + name + " 创建失败");
  101. } catch (IOException e) {
  102. e.printStackTrace();
  103. }
  104. }
  105. /**
  106. * @param args
  107. */
  108. public static void main(String[] args) {
  109. PostgresTest o = new PostgresTest();
  110. o.uploadImage("d:", "23.jpg");
  111. o.uploadImage("d:", "24.jpg");
  112. o.downloadImage("d:");
  113. }
  114. }

Postgres建表SQL

  1. -- Table: notice_image
  2. -- DROP TABLE notice_image;
  3. CREATE TABLE notice_image
  4. (
  5. id serial NOT NULL,
  6. image_name character varying(256) NOT NULL DEFAULT ''::character varying,
  7. image_file bytea,
  8. CONSTRAINT pk_notice_image PRIMARY KEY (id)
  9. )
  10. WITH (OIDS=FALSE);
  11. ALTER TABLE notice_image OWNER TO postgres;

【转】Oracle中插入和取出图片(用BLOB类型)的更多相关文章

  1. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

  2. for循环往Oracle中插入n条数据,主键自增

    1.主键自增实现方法:http://www.cnblogs.com/Donnnnnn/p/5959871.html 2.for循环往Oracle中插入n条数据 BEGIN .. loop insert ...

  3. MyBatis在Oracle中插入数据并返回主键的问题解决

    引言:  在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle. Spring 3.2   SQL Snipp ...

  4. 向oracle中插入date时,持久层sql怎么写???

    public class EmpDao { public void addEmp(Emp emp) throws SQLException { QueryRunner runner = new Que ...

  5. C# Word文档中插入、提取图片,文字替换图片

    Download Files:ImageOperationsInWord.zip 简介 在这篇文章中我们可以学到在C#程序中使用一个Word文档对图像的各种操作.图像会比阅读文字更有吸引力,而且图像是 ...

  6. Oracle中插入100万条数据

    在做项目的工程中,需要数据库中存在大量的数据进行程序的验证,但是我们又没有数据,这时就需要我们自己手动建一个表,插入大量数据,进行验证. 那么插入大量数据的sql语句如下: insert into E ...

  7. 向Oracle中插入记录时,出现“Oracle.DataAccess.Client.OracleException ORA-00933 ”错误

    错误信息的弹出框

  8. log4j向oracle中插入一条系统当前时间的sql语句

    配置log4j,要向oracle插入一条系统当前时间的sql语句,按网上查找的总是出现各种各样的报错,最后总结出的写法是: ### shezhi### log4j.rootLogger = debug ...

  9. hibernate在Oracle中插入数据,默认字段被设置为null的问题解决

    参考内容: http://blog.sina.cn/dpool/blog/s/blog_90629d5301014a5w.html 在数据库中一个字段的默认值为1,但是在插入数据后,本来该字段为空,值 ...

随机推荐

  1. 解决Oracle安装时报错“SID已在使用”办法

    1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务. 2. 开始->程序->Oracle - OraHome81->Oracle I ...

  2. 数据库之MySQL(四)

    数据库中的范式: 第一范式(1NF): 数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性. 例如: userInfo: '山东省烟台市 1318162008' 依照第一范式 ...

  3. centos6.9下php7安装zip扩展

    cd /usr/local/src wget http://pecl.php.net/get/zip-1.13.5.tgz tar -zxvf zip-1.13.5.tgz cd zip-1.13.5 ...

  4. 洗牌算法Fisher-Yates以及C语言随机数的产生

    前些天在蘑菇街的面试中碰到一道洗牌的算法题,拿出来和大家分享一下! 原题是:54张有序的牌,如何无序的发给3个人? 这个题是运用经典的洗牌算法完成.首先介绍一种经典的洗牌算法--Fisher-Yate ...

  5. F110操作手册-自动付款

    SAP 系统 F110系统操作手册 目 录                                      1.自动付款... 3 1.自动付款 事务代号: F110 菜单路径: 会计 →财 ...

  6. 剑指offer 面试8题

    面试8题: 题目:二叉树的下一个节点 题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路:详见剑 ...

  7. func && operation_yes || operation_no (Shell)

    通过&&, || 理解shell中的函数返回值. 我想实现如下功能: 写一个函数判断一个字符串中是否只包含数字,并返回相应的标志(是/否); 通过调用上面的函数,判断给定的字符串是否只 ...

  8. 【整理学习Hadoop】H D F S 一个分布式文件系统

    Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时,它和其他的分布式文件系统的区别 ...

  9. 解释*args和**kwargs的含义

    当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用*args def func(*args): for i in args: print(i) func(3,2,1,4,7) ...

  10. Android下拉快捷设置面板添加快捷开关流程

    快速设定面板上快捷开关的加载流程,包括图标等的加载和点击事件等的处理过程,以及创建一个快捷开关的主要过程(以增加一个锁屏开关为例).本文所讨论的Android版本为5.1. 快捷开关的加载流程 资源模 ...