首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 檔案上傳三大技術方案對比:mod_plsql、9iAS Tag Library、JDBC 實作詳解

     編輯:Oracle 資料庫相關知識

方案概覽

方案架構層級支援中文檔名客戶端直傳適用場景
mod_plsql (OHS)Database Gateway✅✅PL/SQL 為主、輕量級 Web 應用
9iAS Tag Library / BeanMiddle Tier (J2EE)❌✅JDeveloper 開發、J2EE 整合專案
JDBC (BLOB/CLOB)Application Server視實作而定❌ (僅 Server 端檔案)Java 應用、需精細控制串流處理

方案一:Oracle HTTP Server (OHS) mod_plsql

核心架構

  • Browser → OHS (mod_plsql) → Database (DAD) → Document Table
  • 自動處理 Multipart/Form-Data 解析、MIME 偵測、檔案大小計算

實作步驟

  1. 建立文件存取表 (需含 BLOB 或 LONG RAW 欄位,僅能有一個):
    CREATE TABLE content_table (
      name        VARCHAR2(256) PRIMARY KEY,
      mime_type   VARCHAR2(128),
      doc_size    NUMBER,
      dad_charset VARCHAR2(128),
      last_updated DATE,
      content_type VARCHAR2(128),
      blob_content BLOB
    );
  2. 配置 DAD (Database Access Descriptor):
    • Document Table:content_table
    • Document Access Path:虛擬路徑 (如 /docs/)
    • Document Access Procedure:處理下載的 PL/SQL 程序
    • Long Raw 字段:指定以 Long Raw 存儲的副檔名 (如 .txt,.pdf),* 表全部
  3. 上傳頁面 (PL/SQL 產生 HTML):
    CREATE OR REPLACE PROCEDURE upload_page AS
    BEGIN
      htp.htmlOpen;
      htp.bodyOpen;
      htp.formOpen('upload_action', 'POST', 'enctype="multipart/form-data"');
      htp.formFile('upload_file', '選擇檔案');
      htp.formSubmit('上傳');
      htp.formClose;
      htp.bodyClose;
      htp.htmlClose;
    END;
  4. 處理上傳動作:mod_plsql 自動將檔案寫入 Document Table,開發者可在指定 Procedure 中記錄 Log、發送通知等。
  5. 瀏覽/下載:透過 Document Access Path 直接以 MIME 類型瀏覽或下載。

優缺點

  • ✅ 開發最簡單、自動處理中文檔名、支援斷點續傳 (需配置)
  • ❌ 單筆記錄僅能存一個檔案、大檔受限於 plsql_max_request_size (預設 1MB,可調大)
  • ❌ 12c 後 OHS 漸被 WebLogic/Standalone 取代,維護成本上升

方案二:Oracle 9iAS Tag Library / Bean (JDeveloper)

核心組件

  • oracle.jsp.taglib.fileupload.* 標籤庫
  • oracle.servlet.FileUploadBean JavaBean

JSP 頁面範例

in_file.jsp (上傳表單):

<%@ taglib uri="oracle.jsp.taglib.fileupload" prefix="fu" %>

  
  

up_file.jsp (處理與列表):


<%
  Vector files = uploadBean.getFiles();
  for (int i=0; i");
  }
%>

dn_file.jsp (下載):

" />

優缺點

  • ✅ JDeveloper 視覺化拖拉開發、整合 J2EE 安全/Session
  • ❌ 不支援中文檔名 (ISO-8859-1 編碼限制)
  • ❌ 9iAS 已停止維護,現代專案不建議新採用

方案三:JDBC 直接寫入 BLOB/CLOB

上傳流程 (Server 端檔案 → DB)

// Blob_in_stream.jsp
File file = new File("/server/path/file.pdf");
FileInputStream fis = new FileInputStream(file);

Connection conn = DriverManager.getConnection(url, user, pwd);
conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement(
  "INSERT INTO docs (id, content) VALUES (?, EMPTY_BLOB())");
ps.setInt(1, 1);
ps.executeUpdate();

ps = conn.prepareStatement("SELECT content FROM docs WHERE id=1 FOR UPDATE");
ResultSet rs = ps.executeQuery();
rs.next();
Blob blob = rs.getBlob(1);
OutputStream os = blob.setBinaryStream(1);

byte[] buffer = new byte[8192];
int len;
while ((len = fis.read(buffer)) != -1) {
  os.write(buffer, 0, len);
}
os.close(); fis.close(); rs.close();
conn.commit();

下載流程 (DB → Server 端檔案)

// Blob_w_stream.jsp
Blob blob = rs.getBlob("content");
InputStream is = blob.getBinaryStream();
FileOutputStream fos = new FileOutputStream("/server/path/out.pdf");
// ... copy stream ...
// 注意:此為 Server 本地寫入,非 Client 下載

優缺點

  • ✅ 完全控制串流、支援超大檔 (分段寫入)、交易整合性佳
  • ❌ 非 Client 直傳:需先上傳至 App Server 暫存,再寫入 DB,雙倍 I/O
  • ❌ 程式碼複雜、需自行處理例外、資源釋放、交易邊界

現代化建議 (12c/19c/21c/23c)

  1. ORDS (Oracle REST Data Services):RESTful API 上傳至 BLOB,支援分塊上傳、中文檔名、標準 HTTP 憑證。
  2. APEX (Application Express):內建檔案上傳元件、自動處理安全、版本、存儲於 WWV_FLOW_FILES。
  3. 雲端儲存整合:上傳至 OCI Object Storage / S3,DB 僅存儲 Object URL + Metadata。
  4. 客戶端直傳預簽名 URL:前端直傳物件儲存,後端驗證後寫入 DB Metadata,零 I/O 經應用伺服器。

結語

三大方案中,mod_plsql 開發效率最高但架構老舊;JDBC 控制最精細但非直傳;9iAS Tag Library 已淘汰。新專案首選 ORDS/APEX 或雲端儲存直傳架構,兼顧開發效能、擴展性與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved