直リンクの実装の詳細、特にページの保護に関する説明については記事「特定のページへの直リンクによるアクセス」を参照してください。ページ・プロパティのディープ・リンクやページ保護の設定の意味について説明をしています。
本記事では、主に実装の手順について紹介します。
以下のような機能を、本記事では実装します。ダウンロードURLを電子メールなどに含めることにより、ファイルを共有することができます。
アプリケーション・アイテムの作成
共有コンポーネントのアプリケーション・アイテムを開きます。
作成済みのアプリケーション・アイテムが一覧されます。
作成を実行します。
作成するアプリケーション・アイテムは名前をIDとし、セッション・ステート保護は制限なしに設定します。設定した後、アプリケーション・アイテムの作成を実行します。
直リンクとなるURLを、セッションの開始時にアプリケーション・アイテムとして設定します。アプリケーションがインストールされているワークスペース名やアプリケーション別名によってURLは変わります。
アプリケーション・アイテムの名前はG_DOWNLOAD_URLとします。セキュリティのセッション・ステート保護は制限付き - ブラウザから設定不可を選択し(これがデフォルトです)、アプリケーションのユーザーによる値の設定を禁止します。
アプリケーション・アイテムIDおよびG_DOWNLOAD_URLが作成されます。
アプリケーション・アイテムG_DOWNLOAD_URLに値を設定します。
共有コンポーネントのアプリケーションの計算を開きます。
作成済みのアプリケーションの計算が一覧されます。作成をクリックします。
計算アイテムとしてG_DOWNLOAD_URLを選択します。頻度の計算ポイントは新規インスタンス(新規セッション)開始時です。
計算の計算タイプにファンクション本体を選択し、計算として以下の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
/* | |
* 簡易URLがONのときにAPEX_UTIL.HOST_URL('SCRIPT')が正しい値を | |
* 返さないことがある。以下はそのワークアラウンドとしての実装も含む。 | |
*/ | |
declare | |
l_download_url varchar2(800); | |
l_apex_path varchar2(400); | |
l_pattern varchar2(100); | |
l_alias varchar2(200); | |
begin | |
/* https://ホスト名:ポート番号/ords まで。 */ | |
l_apex_path := apex_util.host_url('APEX_PATH'); | |
/* ORDS別名を取得する。通常はワークスペース名に一致する。 */ | |
select pattern into l_pattern from user_ords_schemas | |
where parsing_schema = sys_context('USERENV','CURRENT_USER'); | |
/* | |
* アプリケーション別名。 日本語の対応を行なっているが効果は未確認。 | |
* 本来はAPEX_URL.HOST_URL('SCRIPT')はここまでの文字列を返す。 | |
*/ | |
l_alias := utl_url.escape(lower(:APP_ALIAS), false, 'AL32UTF8'); | |
/* 全体としてのURL */ | |
l_download_url := l_apex_path || 'r/' || l_pattern || '/' || l_alias || '/download?id='; | |
return l_download_url; | |
end; |
計算の作成をクリックします。
アプリケーションの計算が作成されました。
セッションの開始時にアプリケーション・アイテムG_DOWNLOAD_URLに直接ダウンロードするためのURLが設定されます。
ダウンロード機能の実装
プログラムの中からファイルのダウンロードを呼び出すために、APEX_UTIL.GET_BLOB_FILE_SRCを使用します。このAPIの引数p_item_nameとして、ダウンロードするファイルが保存されているBLOB列が割り当てられているページ・アイテムを指定します。このようなページ・アイテムは通常、フォームに含まれています。
今回のアプリケーションでは表SFM_CONTENTSのフォームが、ページ番号3のSfm Contentとして作成されています。フォームに含まれるページ・アイテムP3_CONTENTをp_item_nameに与えることができます。
ページ・アイテムP3_CONTENTを使って、ダウンロード機能を実装します。アプリケーションにp_item_nameとして割り当て可能なページ・アイテムが含まれない場合は、フォームを実装したページを新たに作成する必要があります。
ダウンロード機能を実装するページを作成します。
ページの作成を実行します。
空白ページを選択します。
ページ定義の名前はdownloadとします。ダウンロードURLのターゲットはこのページ名になります。ページ・モードは標準、ナビゲーションのブレッドクラムの使用、ナビゲーションの使用はともにOFFです。この空白のページがユーザーに表示されることはありません。
ページの作成を実行します。
ページが作成されます。
ページ・プロパティのセキュリティに含まれるディープ・リンクを有効にします。また、ページ・アクセス保護は制限なしにします。
レンダリング前のヘッダー前にプロセスを作成します。
識別の名前はダウンロード、タイプはコードの実行を選択します。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_exist integer; | |
begin | |
-- IDが存在しなければ、ORA-1403 を発生させる。 | |
select 1 into l_exist from sfm_contents where id = :ID; | |
apex_util.redirect_url( | |
apex_util.get_blob_file_src( | |
p_item_name => 'P3_CONTENT', | |
p_v1 => :ID, | |
p_content_disposition => 'attachment' | |
) | |
); | |
apex_application.stop_apex_engine; | |
end; |
サーバー側の条件のタイプにアイテムはNULLではないを選択し、アイテムにIDを指定します。URLの引数としてIDがなければプロセスは実行しません。
以上で実装は完了です。
直接ファイルをダウンロードするURLを確認します。
対話モード・レポートのソースに以下の列DOWNLOAD_URLを追加します。
:G_DOWNLOAD_URL || id download_url
ページ番号2の対話モード・レポートのソースのSQL問合せを以下のSELECT文に置き換えます。
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
select | |
id | |
,title | |
,abstract | |
,sys.dbms_lob.getlength(content) content | |
,content_filename | |
,content_mimetype | |
,content_charset | |
,content_lastupd | |
,:G_DOWNLOAD_URL || id download_url | |
from sfm_contents |
アプリケーションを実行し、対話モード・レポートに表示する列にDownload Urlを追加します。
表示されたURLを直接アクセスすると、ユーザー認証が要求されます。これはページdownloadが認証が必要なページとして設定されているためです。正しいユーザー名とパスワードでサインインを行うとファイルのダウンロードが開始します。ページのディープ・リンクが有効でなければ、サインインの後は必ずホーム・ページが開くように制限されるため、ページdownloadが開くことはありません。また、ページ・アクセス保護が制限なしであるため、引数idの指定が許されています。
続く