オブジェクトのダウンロードは独立したページに実装します。
ページの作成を実行します。
空白ページを選択します。
名前をdownload、ページ・モードは標準を選択します。ナビゲーションのブラッドクラムの使用、ナビゲーションの使用はともにOFFとします。
ページの作成をクリックします。
作成されたページに、ダウンロードするオブジェクトを決める引数となるページ・アイテムを作成します。
ページ・アイテムP6_BUCKET_NAMEを作成します。タイプはテキスト・フィールド、ラベルはBucket Nameとしています。
実際にはdownloadのページは表示されないため、タイプは非表示や表示のみでも構いません。
ヘッダーの前の上でコンテキスト・メニューを表示させ、プロセスの作成を実行します。
作成されたプロセスの識別の名前をdownloadとし、ソースのPL/SQLコードに以下を記述します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_response dbms_cloud_oci_obs_object_storage_get_object_response_t; | |
l_status_code number; | |
l_blob blob; | |
l_object_name varchar2(4000); | |
plsql_sdk_error exception; | |
-- 日本語に対応させる | |
function cs_workaround(str varchar2) | |
return varchar2 | |
as | |
begin | |
return utl_url.escape(str, false, 'AL32UTF8'); | |
end cs_workaround; | |
begin | |
l_object_name := cs_workaround(:P6_OBJECT_NAME); | |
l_response := dbms_cloud_oci_obs_object_storage.get_object( | |
namespace_name => :G_NAMESPACE_NAME | |
,bucket_name => :P6_BUCKET_NAME | |
,object_name => l_object_name | |
,region => :G_REGION | |
,credential_name => :G_CREDENTIAL_NAME | |
); | |
l_status_code := l_response.status_code; | |
if l_status_code != 200 then | |
raise plsql_sdk_error; | |
end if; | |
l_blob := l_response.response_body; | |
sys.htp.init; | |
sys.htp.p('Content-Length: ' || dbms_lob.getlength(l_blob)); | |
sys.htp.p('Content-Disposition: attachment; filename="' || l_object_name || '"'); | |
sys.owa_util.http_header_close; | |
sys.wpg_docload.download_file(l_blob); | |
apex_application.stop_apex_engine; | |
end; |
DBMS_CLOUD_OCI_DBS_OBJECT_STORAGE.GET_OBJECTを呼び出してBLOBとしてAPEX(データベース)で受け取ったデータを、WPG_DOCLOAD.DOWNLOAD_FILEプロシージャを呼び出すことによってAPEXからブラウザにダウンロードしています。
一旦オブジェクト全体をデータベースで保持する形になるため、巨大なファイルの扱いには注意が必要と思われます。きちんと調べていませんが、多分、最低でもファイルのサイズ分だけPGAが消費されるのではないでしょうか。
最後にオブジェクト一覧のレポートから、オブジェクト名をクリックするとダウンロードが開始するようにリンクを設定します。
オブジェクト一覧のページをページ・デザイナで開きます。対話モード・レポートに含まれる列NAMEを選択し、タイプをリンクに変更します。ターゲットとして先程作成したダウンロードを行うページ、リンク・テキストは#NAME#とします。
ターゲットとして、タイプはこのアプリケーションのページ、ページは6(ダウンロードのページ)、アイテムの設定として、P6_BUCKET_NAMEへはカレント・ページより&P4_BUCKET_NAME.、P6_OBJECT_NAMEには列#NAME#を渡します。OKをクリックします。
以上でダウンロードの機能も実装完了です。オブジェクト一覧画面を表示し、動作を確認します。
列Nameのリンクをクリックすることにより、オブジェクト・ストレージからダウンロードができます。
以上でPL/SQL SDKを使ってオブジェクト・ストレージを操作するアプリケーションは完成です。オブジェクト・ストレージの操作に直接は関係しない設定は、記事が長くなるため除外しています。ですので、アプリケーションを実用レベルにあげるには、それらも調整する必要があるでしょう。
今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/oci-object-storage-manager.zip
Oracle APEXのアプリケーション開発の参考になれば幸いです。
完