Oracle 是眾多企業級應用程序的首選數據庫,它不僅可以高效地存儲結構化數據,還可以靈活地存儲各種非結構化數據,比如圖片、視頻等。本文將主要介紹 Oracle 數據庫中如何存儲圖片。
在 Oracle 中存儲圖片,有兩種方式:
- 將圖片存儲在數據庫表的一個二進制列中;
- 將圖片存儲在文件系統中,并在數據庫表中保存其路徑。
哪種方式更好?這取決于您的具體需求。如果您期望數據庫自動維護數據完整性、備份和恢復等方面,那么把圖片存儲在二進制列中肯定是更好的選擇。但如果您對數據的存儲、管理比較熟悉,那么將圖片存儲在文件系統,有助于提高訪問速度。
下面我們就來看一下如何通過 Oracle Database 實現這兩種方式。
方式1:二進制存儲
在數據庫中建立一個表,其中有一個 BLOB 類型的列,用于存儲圖片二進制數據。
CREATE TABLE IMAGE_STORE ( ID NUMBER PRIMARY KEY, NAME VARCHAR2(255), IMAGE BLOB );
接下來,我們就可以使用 Java 或者其他編程語言向這個表插入圖片二進制數據了。以下是一個簡單的 Java 實現:
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO IMAGE_STORE VALUES (?, ?, ?)"); pstmt.setLong(1, 1); pstmt.setString(2, "avatar.png"); byte[] imageData = readImageDataFromFile("avatar.png"); pstmt.setBytes(3, imageData); pstmt.executeUpdate(); pstmt.close();
讀取數據也很簡單,如下所示:
Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT IMAGE FROM IMAGE_STORE WHERE ID = 1"); if (rs.next()) { InputStream inputStream = rs.getBinaryStream(1); OutputStream outputStream = new FileOutputStream("avatar_copy.png"); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } outputStream.flush(); outputStream.close(); inputStream.close(); }
方式2:文件系統存儲
將圖片存儲在文件系統中,意味著我們需要多建立一個表,用于保存圖片的路徑。
CREATE TABLE IMAGE_PATH ( ID NUMBER PRIMARY KEY, NAME VARCHAR2(255), PATH VARCHAR2(255) );
當我們要插入一張圖片時,除了在 IMAGE_STORE 表中存儲二進制數據外,還需要在 IMAGE_PATH 表中保存該圖片的路徑。
PreparedStatement pstmt1 = conn.prepareStatement("INSERT INTO IMAGE_STORE VALUES (?, ?, ?)"); pstmt1.setLong(1, 1); pstmt1.setString(2, "avatar.png"); byte[] imageData = readImageDataFromFile("avatar.png"); pstmt1.setBytes(3, imageData); pstmt1.executeUpdate(); pstmt1.close(); PreparedStatement pstmt2 = conn.prepareStatement("INSERT INTO IMAGE_PATH VALUES (?, ?, ?)"); pstmt2.setLong(1, 1); pstmt2.setString(2, "avatar.png"); pstmt2.setString(3, "/path/to/image/avatar.png"); pstmt2.executeUpdate(); pstmt2.close();
讀取數據時,首先需要查詢 IMAGE_PATH 表獲取圖片路徑,然后我們才能從文件系統中讀取圖片數據。
Statement stmt1 = conn.createStatement(); ResultSet rs1 = stmt1.executeQuery("SELECT PATH FROM IMAGE_PATH WHERE ID = 1"); String path = null; if (rs1.next()) { path = rs1.getString(1); } rs1.close(); stmt1.close(); if (path != null) { InputStream inputStream = new FileInputStream(path); OutputStream outputStream = new FileOutputStream("avatar_copy.png"); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } outputStream.flush(); outputStream.close(); inputStream.close(); }
結語
無論是將圖片存儲在二進制列中還是文件系統中,選擇哪種方式都需要根據具體需求來決定。在使用 Oracle 數據庫存儲圖片時,開發者需要對文件的讀寫操作比較熟悉,設計表結構時也應該充分考慮到數據完整性、備份和恢復等方面的問題。