Oracle 提供多種檔案上傳路徑,本文聚焦三大主流技術:
mod_plsql 模組 — 透過 Web 頁面上傳至資料庫;每筆上傳檔案佔用一列,CONTENT_TYPE 僅支援單一 BLOB 或 LONG RAW 欄位:
CREATE TABLE content_table (
NAME VARCHAR2(128) UNIQUE NOT NULL,
MIME_TYPE VARCHAR2(128),
DOC_SIZE NUMBER,
DAD_CHARSET VARCHAR2(128),
LAST_UPDATED DATE,
CONTENT_TYPE VARCHAR2(128),
CONTENT LONG RAW,
BLOB_CONTENT BLOB
);
content_table;使用 HTP.PRN 輸出 HTML 表單,enctype="multipart/form-data",action 指向處理程序 /pls/upfile/write_infos。表單包含標題、類別、作者、摘要及最多四個檔案輸入欄位。
CREATE OR REPLACE PROCEDURE WRITE_INFOS (
filetitle IN VARCHAR2,
up_file IN OWA.VC_ARR,
filesort IN VARCHAR2,
author IN VARCHAR2,
abstract IN VARCHAR2,
localsort IN VARCHAR2
) AS
i NUMBER := 1;
BEGIN
HTP.HTMLOPEN; HTP.HEADOPEN; HTP.TITLE('File Uploaded'); HTP.HEADCLOSE; HTP.BODYOPEN;
HTP.HEADER(1, 'Upload Status');
WHILE TRUE LOOP
BEGIN
HTP.PRN('Uploaded ' || up_file(i) || ' successfully!
');
HTP.PRN('Open this file!
');
INSERT INTO "ZYFILEUP"."FILE_TABLE"
VALUES (filetitle, up_file(i), filesort, author, SYSDATE, abstract, localsort);
COMMIT;
i := i + 1;
EXCEPTION WHEN NO_DATA_FOUND THEN EXIT;
END;
END LOOP;
HTP.LINE; HTP.PRINT('Uploaded successfully!'); HTP.BODYCLOSE; HTP.HTMLCLOSE;
END;
注意:文件表上傳時間可能與系統時間不符,疑為已知 Bug,需關注補丁。
CREATE OR REPLACE PROCEDURE DOWNFILE (upfilename IN VARCHAR2) AS
mimetype VARCHAR2(100);
myblob BLOB;
BEGIN
SELECT mime_type, blob_content
INTO mimetype, myblob
FROM zyfileup.content_table
WHERE name = upfilename;
OWA_UTIL.MIME_HEADER(mimetype, TRUE);
WPG_DOCLOAD.DOWNLOAD_FILE(myblob);
END;
瀏覽器將依 MIME 類型自動開啟或下載檔案。
利用 <fileUpload> 標籤與 FileUploadBean,支援多檔上傳、大小限制、型別驗證,適合 JSP/Servlet 架構,程式碼較簡潔,此處略過詳細代碼。
使用 PreparedStatement.setBinaryStream 或 setBlob 將檔案流直接寫入資料庫 BLOB 欄位,適用於獨立 Java 應用或批次匯入工具,效能最高,但需自行處理連線池、交易與錯誤重試。
| 技術 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| mod_plsql | 簡單 Web 表單上傳、內部系統 | 零 Java 程式碼、支援中文檔名、自動識別 MIME | 單列單檔、擴充性受限 |
| 9iAS Taglib/Bean | J2EE 應用整合 | 元件化、支援驗證、易維護 | 需 9iAS 環境、學習曲線 |
| JDBC | 批次匯入、高效能需求、非 Web 環境 | 完全控制、效能最佳、無中介層 | 開發量大、需自行管理資源 |
根據系統架構、團隊技術棧與業務需求選擇適合的上傳方案。mod_plsql 適合快速原型與內部工具;J2EE 專案優先考慮標籤庫;大量資料遷移或高併發場景首選 JDBC。