原文地址: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. 关于angularjs的select下拉列表存在空白的解决办法

    angularjs 的select的option是通过循环造成的,循环的方式可能有ng-option或者</option  ng-repeat></option>option中 ...

  2. mysql_数据库_操作

    1.查看数据库 show databases; # 默认数据库: test - 用于用户测试数据 information_schema - MySQL本身架构相关数据 2.创建数据库 #utf- 编码 ...

  3. RedHat6/Centos6.5安装mongodb

    1 设置mongodb目录 [root@localhost /]# cd home/ [root@localhost home]# mkdir mongodb/db 2 配置yum [root@loc ...

  4. passback_params 支付回调的 原样返回字段 自定义字段的存放字段

    开放平台文档中心 https://docs.open.alipay.com/204/105465/ passback_params String 否 512 公用回传参数,如果请求时传递了该参数,则返 ...

  5. Centos7安装dubbo管理控制台

    1.下载dubbo源代码 wget https://github.com/apache/incubator-dubbo/archive/2.5.x.zip 2.进入dubbo-admin目录下 cd ...

  6. ECMAScript6面对大于0xFFFF的Unicode字符如何正确返回长度

    一.match() 1.定义 match()方法用于检索字符串内指定(字符串或正则)的值,返回指定值的数组,若找不到,返回null. 2.语法 str.match(searchvalue) str.m ...

  7. 解决windows server 2003不识别移动硬盘

    解决windows server2003不显示移动硬盘的问题: 1.进入命令提示符环境(也就是DOS) 2.进入DISKPART程序 3.输入AUTOMOUNT ENABLE指令 4.输入OK 下次U ...

  8. Android之四大组件、六大布局、五大存储

    [-] Android六大界面布局方式 1 LinearLayout线性布局 LinearLayout的常用XML属性及相关方法 LinearLayout子元素支持的常用XML属性及方法 2 Tabl ...

  9. 笔画宽度变化(C++和matlab算法)

    最近一直在看工作方面的书籍,把论文的事情搁置了,之前承诺的贴代码的事一直拖.现在把代码整理发上来,只有核心部分的,都不是我写的,我是网上整理下载的,matlab代码的效果比较差. 全部文件网盘下载地址 ...

  10. SpringBoot入门1—简介及helloworld

    Spring Boot简介 Spring Boot让我们的Spring应用变的更轻量化.比如:你可以仅仅依靠一个Java类来运行一个Spring引用.你也可以打包你的应用为jar并通过使用java - ...