Oracle APEXからOCI Object Storageへファイルをアップロード・ダウンロード・削除する実装例
はじめに
Oracle APEXでファイル管理機能を実装する場合、ファイルをBLOBとしてデータベースに保存する方法が一般的です。
しかし、運用が進むにつれて以下のような課題が発生します。
- データベース容量が急激に増加する
- バックアップ時間が長くなる
- 大容量ファイルの管理が難しい
- ストレージコストが増加する
そこで今回は、OCI Object Storage を利用し、Oracle APEXからファイルを管理する方法を紹介します。
本記事では以下の機能を実装します。
- ファイルアップロード
- ファイルダウンロード
- ファイル削除
システム構成
Oracle APEX
↓
PL/SQL
↓
OCI REST API
↓
OCI Object Storage
実際のファイルはObject Storageへ保存し、データベースにはファイルパスやメタ情報のみを保存します。
ファイルアップロード
処理の流れ
File Browse
↓
APEX_APPLICATION_TEMP_FILES
↓
BLOB取得
↓
OCIへPUT
サンプルコード
DECLARE
l_blob BLOB;
l_file_name VARCHAR2(500);
l_object_name VARCHAR2(1000);
BEGIN
SELECT blob_content,
filename
INTO l_blob,
l_file_name
FROM apex_application_temp_files
WHERE name = :P10_FILE;
l_object_name :=
'documents/' ||
TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') ||
'_' ||
l_file_name;
apex_web_service.g_request_headers.delete;
apex_web_service.g_request_headers(1).name :=
'Content-Type';
apex_web_service.g_request_headers(1).value :=
'application/octet-stream';
apex_web_service.make_rest_request_b(
p_url =>
'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/<bucket>/o/' ||
utl_url.escape(l_object_name, TRUE),
p_http_method => 'PUT',
p_body_blob => l_blob,
p_credential_static_id => 'OCI_CREDENTIAL'
);
END;
/
ファイルダウンロード
Object Storageからファイルを取得し、ブラウザへ返却します。
サンプルコード
DECLARE
l_blob BLOB;
BEGIN
l_blob :=
apex_web_service.make_rest_request_b(
p_url =>
'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/<bucket>/o/' ||
utl_url.escape(:P10_FILE_PATH, TRUE),
p_http_method => 'GET',
p_credential_static_id => 'OCI_CREDENTIAL'
);
owa_util.mime_header(
'application/octet-stream',
FALSE
);
htp.p(
'Content-Disposition: attachment; filename="' ||
:P10_FILE_NAME ||
'"'
);
owa_util.http_header_close;
wpg_docload.download_file(l_blob);
apex_application.stop_apex_engine;
END;
/
Interactive Reportへの実装例
レポートにダウンロードアイコンを追加します。
<span class="fa fa-download"></span>
クリック時にApplication Processを呼び出し、ファイルをダウンロードします。
ファイル削除
不要になったファイルはOCI Object Storageから削除できます。
サンプルコード
DECLARE
l_response CLOB;
BEGIN
l_response :=
apex_web_service.make_rest_request(
p_url =>
'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/<bucket>/o/' ||
utl_url.escape(:P10_FILE_PATH, TRUE),
p_http_method => 'DELETE',
p_credential_static_id => 'OCI_CREDENTIAL'
);
END;
/
削除成功時はHTTPステータス 204 No Content が返却されます。
APEXでの実装例
Upload
File Browse
↓
Uploadボタン
↓
OCI Object Storage
Download
Interactive Report
↓
Downloadアイコン
↓
Application Process
Delete
Interactive Report
↓
Deleteアイコン
↓
Ajax Callback
↓
OCI Object Storage
テーブル設計例
ファイル本体はObject Storageに保存するため、DBにはメタ情報のみを保持します。
CREATE TABLE FILE_MASTER (
ID NUMBER GENERATED BY DEFAULT AS IDENTITY,
FILE_NAME VARCHAR2(500),
FILE_PATH VARCHAR2(1000),
CREATED_DATE DATE DEFAULT SYSDATE
);
保存例
| FILE_NAME | FILE_PATH |
|---|---|
| report.pdf | documents/20260622100000_report.pdf |
運用上の注意点
ファイル名の重複対策
同じファイル名がアップロードされる可能性があります。
例えば、
report.pdf
が複数回アップロードされる場合、上書きが発生する可能性があります。
推奨例:
20260622103000_report.pdf
または
550e8400-e29b-41d4-a716-446655440000_report.pdf
BLOBをDBへ保存しない
大量ファイルをBLOB保存すると、
- テーブルサイズ肥大化
- バックアップ時間増加
- パフォーマンス低下
につながります。
Object Storageへ保存することで、DB負荷を大幅に削減できます。
IAM権限の設定
APEXからObject Storageへアクセスするため、適切なIAM Policyが必要です。
例:
Allow group ApexUsers to manage objects in compartment MyCompartment
まとめ
OCI Object Storageを利用することで、Oracle APEXのファイル管理機能をシンプルかつスケーラブルに実装できます。
今回紹介した方法により、
- Upload(PUT)
- Download(GET)
- Delete(DELETE)
をすべてPL/SQLだけで実現できます。
ファイルをデータベースへ保存する方式と比較して、容量・性能・保守性の面で大きなメリットがあるため、OCI環境でのAPEX開発ではObject Storageの活用をおすすめします。