1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle APEXからOCI Object Storageへファイルをアップロード・ダウンロード・削除する実装例

1
Last updated at Posted at 2026-06-22

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の活用をおすすめします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?