2020年2月28日金曜日

APEXからOCIオブジェクト・ストレージを操作する(8) - ファイルのダウンロード

OCIオブジェクト・ストレージにあるオブジェクトをダウンロードするリンクを、ホーム画面のレポートに追加します。
 

オブジェクトをダウンロードするリンクの追加


オブジェクトのダウンロード要求を処理するページを新規に作成します。このページは画面の表示には使われません。アプリケーションの開発画面よりページの作成を実行し、空白ページを選びます。

ページ番号として名前Download Objectページ・モード標準を選択します。ナビゲーションブレッドクラムナビゲーションともにOFFにし、ページの作成を実行します。
 

コンポーネントBodyに、プロセスへ渡す引数の役割をするページ・アイテムP3_BUCKET_NAMEP3_OBJECT_NAMEを作成します。識別タイプは双方とも非表示にします。
 

左ペインのレンダリング・ビューより、レンダリング前に含まれるヘッダーの前の上でコンテキスト・メニューを表示させ、プロセスの作成を実行します。
 

作成したプロセスの識別名前downloadObjectとし、識別タイプコードを実行を指定します。ソース位置ローカル・データベースPL/SQLコードとして以下を記述します。元のブログのコードは日本語の扱いに不備があったので、その部分を修正しています。

declare
l_request_url varchar2(32767);
l_content_type varchar2(32767);
l_content_length varchar2(32767);
l_response blob;
download_failed_exception exception;
begin
l_request_url := :G_BASE_URL || 'b/'
|| :P3_BUCKET_NAME || '/o/'
|| utl_url.escape(:P3_OBJECT_NAME, false, 'AL32UTF8');
l_response := apex_web_service.make_rest_request_b(
p_url => l_request_url
, p_http_method => 'GET'
, p_credential_static_id => :G_OCI_WEB_CREDENTIAL
);
if apex_web_service.g_status_code != 200 then
raise download_failed_exception;
end if;
for i in 1..apex_web_service.g_headers.count
loop
if apex_web_service.g_headers(i).name =
'Content-Length'
then
l_content_length :=
apex_web_service.g_headers(i).value;
end if;
if apex_web_service.g_headers(i).name =
'Content-Type'
then
l_content_type :=
apex_web_service.g_headers(i).value;
end if;
end loop;
sys.htp.init;
if l_content_type is not null then
sys.owa_util.mime_header(trim(l_content_type), false);
end if;
sys.htp.p('Content-length: ' || l_content_length);
sys.htp.p('Content-Disposition: attachment; filename="'
|| utl_url.escape(:P3_OBJECT_NAME, false, 'AL32UTF8') || '"' );
sys.htp.p('Cache-Control: max-age=3600'); -- if desired
sys.owa_util.http_header_close;
sys.wpg_docload.download_file(l_response);
apex_application.stop_apex_engine;
end;


このコードの最後にapex_application.stop_apex_engine;の記載があります。downloadObjectプロセスはAPEXの標準的なページ処理を中断させているため、この後の処理は(どのような処理をページに追加していても)実行されません。

次にページ1のホーム画面をページ・デザイナで開き、オブジェクトの一覧にダウンロード・リンクを追加します。リージョンBucket Contentsの上でコンテキスト・メニューを開き、仮想列の作成を実行します。
 

作成された仮想列DERIVED$01を選択し、リンクが定義されていませんをクリックし、リンク/ターゲットを設定します。
 

リンクのターゲットは先ほど作成したDownload Objectのページなので、ターゲットのタイプこのアプリケーションのページページです。アイテムの設定として、P3_BUCKET_NAMEにはページ・アイテム&P1_BUCKET_NAME.を値として渡し、P3_OBJECT_NAMEにはレポートの出力である#NAME#を値として与えます。OKをクリックして、ターゲットを設定します。
 

最後にリンクリンク・テキストDownloadに変更し、保存をします。
 

これでダウンロード機能の実装ができました。アプリケーションを実行して、ホーム画面のレポートからオブジェクトのダウンロードを実行してみましょう。

続く