在Oracle中存取BLOB物件實現檔案的上傳和下載

longwansheng發表於2009-11-09
%C2%ED%D3%C0/blog/item/5a00b218cb0ef60535fa412f.html/cmtid/b5e9628991fb7bb90f2444bc[@more@]2007-06-26 11:13JAVA存取CLOB和BLOB方法 oracle大物件儲存 java將blob轉化byte 儲存大物件檔案 如何插入一個圖片到Oracle資料庫中(寫出程式碼) oracle+blob+select+java 匯入weblogic.jdbc.vendor.oracle.OracleThinBlob 怎樣存取BLOB圖片 xȡoracleblobֶ SQL檔案存取 oracle存附件檔方式 在VB中怎樣儲存圖片到oracle 怎樣從oracle中讀取圖片檔案 用VB怎樣儲存、讀取oracle資料庫的圖片檔案 IO流存取檔案 oracle中的圖片存取 jsp頁面下載圖片儲存到oracle java中檔案的上傳 怎樣利用java將圖片傳到pl/sql資料庫的blob中 c#中用blob將word寫入到資料庫 資料為空 本地儲存 將一個圖片檔案儲存到ORACLE 圖片存人blob oracle,form,將本地檔案儲存到blob欄位中 如何讀取oracle java讀取MySQL Blob物件 讀大物件 Delphi存取Oracle中的圖片資料 oracle存圖片java oracle,word oracle.sql.BLOB jsp+oracle+讀取檔案 中如何實現上傳和下載 bolb vb讀取oracle中blob物件 存取檔案到Oracle oracle資料庫設計中的檔案上傳和下載 oracle圖片讀取錯誤 最近做一個J2EE專案,需要在JSP頁面實現對檔案的上傳和下載。很早以前就知道JDBC支援大物件(LOB)的存取,以為很容易,做起 來才發現問題多多,讀了一大堆文章,反而沒有什麼頭緒了。正如一位網友文章所講:“…網路上的教程99%都是行不通的,連SUN自 己的文件都一直錯誤……”,實際情況大致如此了。 存取BLOB出現這麼多問題,我認為大半是由資料庫開發商、應用伺服器商在JDBC驅動上的不相容性帶來的。而實際應用中,每個人的 開發執行環境不同,使得某個網友的solution沒有辦法在別人的應用中重現,以至於罵聲一片。至於為什麼會不相容、有哪些問題, 我沒有時間去弄清,這裡只說說我們怎樣解決了問題的。 基於上述原因,先列出我們的開發環境,免得有人配不出來,招人唾罵。 資料庫 Oracle 9i 應用伺服器 BEA Weblogic 8.11 開發工具 JBuilder X 在JSP實現檔案Upload/Download可以分成這樣幾塊 :檔案提交到形成InputSteam;InputSteam以BLOB格式入庫;資料從庫中讀出為 InputSteam;InputStream輸出到頁面形成下載檔案。先說BLOB吧。 1. BLOB入庫 (1) 直接獲得資料庫連線的情況 這是Oracle提供的標準方式, c6e管P@u&*W,理=L_ 先插入一個空BLOB物件,然後Update這個空物件。程式碼如下: //得到資料庫連線(驅動包是weblogic的,沒有下載任何新版本) Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:testdb", "test", "test"); //處理事務 con.setAutoCommit(false); Statement st = con.createStatement(); //插入一個空物件 st.executeUpdate("insert into BLOBIMG values(103,empty_blob())"); //用for update方式鎖定資料行 ResultSet rs = st.executeQuery( "select contents from BLOBIMG where id=103 for update"); if (rs.next()) { //得到java.sql.Blob物件, 軟#qc的業:R網網然後Cast為oracle.sql.BLOB oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1).; //到資料庫的輸出流 OutputStream outStream = blob.getBinaryOutputStream(); //這裡用一個檔案模擬輸入流 File file = new File("d:proxy.txt"); InputStream fin = new FileInputStream(file); //將輸入流寫到輸出流 byte[] b = new byte[blob.getBufferSize()]; int len = 0; while ( (len = fin.read(b)) != -1) { outStream.write(b, 0, len); //blob.putBytes(1,b); } //依次關閉(注意順序) fin.close(); outStream.flush(); outStream.close(); con.commit(); con.close(); (2) 透過JNDI獲得資料庫連線 在Weblogic中配置到Oracle的JDBC Connection Pool和DataSource, GBTO垠gXNtHU~中$Yiv育G 繫結到Context中,假定繫結名為”orads”。 為了得到資料庫連線,做一個連線工廠,主要程式碼如下: Context context = new InitialContext(); ds = (DataSource) context.lookup("orads"); return ds.getConnection(); 以下是BLOB寫入資料庫的程式碼: Connection con = ConnectionFactory.getConnection(); con.setAutoCommit(false); Statement st = con.createStatement(); st.executeUpdate("insert into BLOBIMG values(103,empty_blob())"); ResultSet rs = st.executeQuery( "select contents from BLOBIMG where id=103 for update"); if (rs.next()) { //上面程式碼不變 //這裡不能用oracle.sql.BLOB,管:$F&baIn國cT專TW]*t專I.管中d(w的(AgKqzLW*xH管Ut件G會報ClassCast 異常 weblogic.jdbc.vendor.oracle.OracleThinBlobblob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob(1); //以後程式碼也不變 OutputStream outStream = blob.getBinaryOutputStream(); File file = new File("d:proxy.txt"); InputStream fin = new FileInputStream(file); byte[] b = new byte[blob.getBufferSize()]; int len = 0; while ( (len = fin.read(b)) != -1) { outStream.write(b, 0, len); } fin.close(); outStream.flush(); outStream.close(); con.commit(); con.close(); 2. BLOB出庫 從資料庫中讀出BLOB資料沒有上述由於連線池的不同帶來的差異,只需要J2SE的標準類java.sql.Blob就可以取得輸出流(注意區別 java.sql.Blob和oracle.sql.BLOB)。程式碼如下: Connection con = ConnectionFactory.getConnection(); con.setAutoCommit(false); Statement st = con.createStatement(); //這裡的SQL語句不再需要”for update” ResultSet rs = st.executeQuery( "select contents from BLOBIMG where id=103 "); if (rs.next()) { java.sql.Blob blob = rs.getBlob(1); InputStream ins = blob.getBinaryStream(); //用檔案模擬輸出流 File file = new File("d:output.txt"); OutputStream fout = new FileOutputStream(file); //下面將BLOB資料寫入檔案 byte[] b = new byte[1024]; int len = 0; while ( (len = ins.read(b)) != -1) { fout.write(b, 0, len); } //依次關閉 fout.close(); ins.close(); con.commit(); con.close(); 3. 從JSP頁面提交檔案到資料庫 (1)提交頁面的程式碼如下:
(2)由於JSP沒有提供檔案上傳的處理能力,只有使用第三方的開發包。網路上開源的包有很多,我們這裡選擇Apache Jakarta的 FileUpload,在 可以得到下載包和完整的API文件。法奧為 adajspException 處理頁面(handle.jsp)的程式碼如下 "); out.println("Value: "+item.getString()+"
"); } } } --&gt4. 從資料庫讀取BLOB然後儲存到客戶端磁碟上 這段程式碼有點詭異,執行後將會彈出檔案儲存對話視窗,將BLOB資料讀出儲存到本地檔案。全文列出如下: 注意,在之外,絕對不能有任何字元,空格或回車都不行,不然會導致outputStream出錯,對非ASCII輸出檔案來說就是格式錯誤不可讀。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/92289/viewspace-1028548/,如需轉載,請註明出處,否則將追究法律責任。

相關文章