六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 69|回复: 0

Oracle中插入图片并显示(用BLOB类型)

[复制链接]

升级  78%

9

主题

9

主题

9

主题

童生

Rank: 1

积分
39
 楼主| 发表于 2013-1-27 05:28:31 | 显示全部楼层 |阅读模式
Oracle中插入图片并显示(用BLOB类型)
要在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();                 }           }     }


操作完毕!
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表