複製程式碼如下:
com.wanmei.meishu 包;
導入 java.io.FileInputStream;
導入 java.io.FileOutputStream;
導入 java.io.FileReader;
導入 java.io.InputStream;
導入 java.io.OutputStream;
導入java.sql.Connection;
導入 java.sql.DriverManager;
導入 java.sql.PreparedStatement;
導入java.sql.ResultSet;
導入java.sql.SQLException;
導入java.util.Properties;
導入 oracle.sql.BLOB;
公共類別 BlobUtil {
私有靜態 BlobUtil bu;
私有字串環境;
公用靜態 BlobUtil getInstance(String env) {
bu = new BlobUtil();
bu.env = env;
返回卜;
}
/**
* <p>取得資料庫連結</p>
* @返回
* @拋出例外
*/
私有連線 getConnection() 拋出例外 {
字串驅動程式=“oracle.jdbc.driver.OracleDriver”;
Class.forName(驅動程式);
字串 env = this.env;
屬性 pro = 新屬性();
// 讀取classes目錄下的設定檔
pro.load(new FileReader(Class.class.getResource("/config.properties").getFile()));
String host = pro.getProperty(env + ".host");
字串資料庫 = pro.getProperty(env + ".database");
String username = pro.getProperty(env + ".username");
字串密碼 = pro.getProperty(env + ".password");
String port = pro.getProperty(env + ".port");
String url = "jdbc:oracle:thin:@" + 主機 + ":" + 連接埠 +":" + 資料庫;
return DriverManager.getConnection(url, 使用者名稱, 密碼);
}
/**
* <p>建立項目,任務,附件名稱,檔案路徑,讀取資料庫</p>
* @param 項目ID
* @參數任務ID
* @param 檔名
* @參數文件
* @return 回傳是否成功
*/
公共布爾寫入(字串項目ID,字串任務ID,字串檔名,字串檔){
連接 conn = null;
結果集 rs = null;
準備語句 ps = null;
BLOB 斑點 = null;
布爾標誌= false;
嘗試 {
conn = getConnection();
conn.setAutoCommit(假);
String sql = "INSERT INTO PS_ZP_PRJ_WBS_BLOB BLB(ZP_PRJ_ID, ZZ_SEQ_NUM, ZZ_FILE_NAME, ZZ_IMAGE_BLOB) VALUES(?, ? ,? ,empty_blob())";
ps = conn.prepareStatement(sql);
ps.setString(1, 項目Id);
ps.setString(2, 任務Id);
ps.setString(3, 檔案名稱);
ps.executeUpdate();
sql = "從 PS_ZP_PRJ_WBS_BLOB 中選擇 ZZ_IMAGE_BLOB,其中 ZP_PRJ_ID = ? AND ZZ_SEQ_NUM = ? AND ZZ_FILE_NAME = ? 用於更新";
ps = conn.prepareStatement(sql);
ps.setString(1, 項目Id);
ps.setString(2, 任務Id);
ps.setString(3, 檔案名稱);
rs = ps.executeQuery();
if(rs.next()) {
blob = (BLOB) rs.getBlob(1);
}
輸入流 = new FileInputStream(文件);
OutputStream out = blob.setBinaryStream(1L);
位元組[]緩衝區=新位元組[1024];
整數長度=-1;
while ((長度 = in.read(buffer)) != -1){
out.write(緩衝區, 0, 長度);
}
附寄();
關閉();
conn.commit();
conn.setAutoCommit(true);
標誌=真;
}
捕獲(異常e){
如果(conn!= null){
嘗試 {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
最後 {
嘗試 {
rs.close();
ps.close();
conn.close();
}
捕獲(異常e){
e.printStackTrace();
}
}
返回標誌;
}
/**
* <p>根據項目Id,任務Id,文件名讀取資料庫blob欄位文件,讀取指定的文件路徑</p>
* @param 項目ID
* @param 任務ID
* @param 檔名
* @參數文件
* @return 回傳是否成功
*/
公共布林讀取(字串項目ID,字串任務ID,字串檔名,字串檔){
連接 conn = null;
結果集 rs = null;
準備語句 ps = null;
BLOB 斑點 = null;
布爾標誌= false;
嘗試 {
conn = getConnection();
String sql = "從 PS_ZP_PRJ_WBS_BLOB 中選擇 ZZ_IMAGE_BLOB,其中 ZP_PRJ_ID = ? AND ZZ_SEQ_NUM = ? AND ZZ_FILE_NAME = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, 項目Id);
ps.setString(2, 任務Id);
ps.setString(3, 檔案名稱);
rs = ps.executeQuery();
if(rs.next()) {
blob = (BLOB) rs.getBlob(1);
}
輸入流= blob.getBinaryStream();
位元組[] buf = 新位元組[1024];
int 位元組 = 0;
FileOutputStream out = new FileOutputStream(文件);
while ((bytesIn = in.read(buf, 0, 1024)) != -1) {
out.write(buf, 0, bytesIn);
}
附寄();
關閉();
標誌=真;
}
捕獲(異常e){
e.printStackTrace();
}
最後 {
嘗試 {
rs.close();
ps.close();
conn.close();
}
捕獲(異常e){
e.printStackTrace();
}
}
返回標誌;
}
公共靜態無效主(字串[] args){
BlobUtil bu = BlobUtil.getInstance("MSDEV");
System.out.println(bu.write("CB", "001", "image1", "D://61e44b02jw1dw4xbp2zo6j.jpg"));
System.out.println(bu.read("CB", "001", "image1", "D://2.jpg"));
}
}