2021年9月8日水曜日

APEXの一時表を使った画像ビューワー・アプリの作成

 Oracle APEXのページ・アイテムのタイプファイル参照...というのがあります。このページ・アイテムを使って、選択した画像ファイルを表示するアプリケーションを作成してみます。

最初に空のアプリケーションを作成します。アプリケーション作成ウィザードを起動します。名前画像ビューワーとして、アプリケーションの作成を実行します。

アプリケーションが作成されたら、ページ・デザイナにてホーム・ページを開きます。ホーム・ページに画像のアップロードと表示の機能を実装します。


アプリケーションとしてはホーム・ページしか含まれないため、ナビゲーション・メニューやブレッドクラムは不要です。ページ・プロパティ外観ページ・テンプレートとしてMinimail (No Navigation)を選択し、ブレッドクラムのリージョン画像ビューワーを削除します。


Content Bodyでリージョンの作成を実行します。識別タイトル画像ビューワーとし、タイプ静的コンテンツとします。リージョンとしての装飾は不要なので、外観テンプレートとしてBlank with Attributesを選択します。


表示するファイルをローカルのファイル・システムから選択するためのページ・アイテムを作成します。

識別名前P1_FILEタイプとしてファイル参照...を選択します。重要な設定は設定記憶域タイプで、これにはTable APEX_APPLICATION_TEMP_FILESを選択します。この記憶域タイプが選択されている場合、ローカルのファイル・システムからアップロードされるファイルは、Oracle APEXが用意している表APEX_APPLICATION_TEMP_FILESに書き込まれます。記憶域タイプとしてBLOB column specified in Item Source attributeを選んだ場合は、BLOB列を持つ表をあらかじめ作成しておく必要があります。アップロードするファイルを永続的に保存する場合は、後者の設定を行った方がよいでしょう。

それ以外の設定は操作方法や見かけに関するものなので、必ずしもこの通りではなくても構いません。今回の手順では、ラベルとしてファイル設定表示形式Block Dropzoneドロップ・ゾーンのタイトルとして画像ファイルの選択ドロップ・ゾーンの説明として「画像ファイルをドラッグ&ドロップします。」を設定しています。


ページ・アイテムP1_FILEで選択されたファイルは、ページの送信を行うまではアップロードされません。ページ・アイテムP1_FILEの値の変更が行われたとき(ファイルが選択されたときになります)に、動的アクションによってページの送信を実行します。

ページ・アイテムP1_FILEで動的アクションの作成を実行します。識別名前ファイルの選択とします。タイミングはデフォルトで、イベント変更選択タイプアイテムアイテムP1_FILEになります。


TRUEアクション識別アクションとして、ページの送信を選択します。これで選択したファイルのアップロードが行われます。今回のアプリケーションでは使用しませんが、設定リクエスト/ボタン名UPLOADとしています。この名前がリクエストの値として送信されるので、サーバー側に作成する検証プロセスサーバー側の条件で使用することができます。


サーバー側の条件タイプには、リクエストを参照するものがあります。これらの条件として上記で設定したリクエスト/ボタン名を使うことができます。


以上でファイルを選択すると、サーバー側に選択されたファイルがアップロードされるようになりました。アップロードされたファイルは表APEX_APPLICATION_TEMP_FILESより参照できます。

アップロードされたファイルを表示するページ・アイテムを作成します。

識別名前P1_IMAGEとします。タイプとしてイメージの表示を選択します。ラベルラベル画像設定基準としてBLOB Column returned by SQL statementを選択し、SQL文として以下を記述します。表APEX_APPLICATION_TEMP_FILESよりアップロードされたファイルの内容であるBLOB列を検索しています。

select blob_content
from apex_application_temp_files
where name = :P1_FILE

外観テンプレートHiddenを選択し、CSSクラスとしてmy-imageを設定しておきます。CSSクラス自体の記述は後ほど、ページ・プロパティに含めます。


アップロードされたファイルの、ファイル名を表示するページ・アイテムを作成します。

識別名前P1_FILENAMEタイプとして表示のみを選択します。ラベルラベルファイル名とします。ソースタイプとしてSQL問合せ(単一の値を返す)を選択し、SQL問合せとして以下を記述します。

select filename
from apex_application_temp_files
where name = :P1_FILE


同様にアップロードされたファイルの、MIMEタイプを表示するページ・アイテムを作成します。

識別名前P1_MIME_TYPEタイプとして表示のみを選択します。ラベルラベルMIMEタイプとします。ソースタイプとしてSQL問合せ(単一の値を返す)を選択し、SQL問合せとして以下を記述します。

select mime_type
from apex_application_temp_files
where name = :P1_FILE


画像の表示を画面にフィットさせるため、ページ・プロパティCSSインラインに以下を記述します。

.my-image div {
display: flex;
justify-content: center;
}

.my-image img {
width: 30%;
height: auto;
}


以上で完成です。ページを実行し画像ファイルをアップロードすると、以下のように表示されます。


画像の表示にカード・リージョンを使うと、複数の画像を表示することができます。

ページ・アイテムP1_FILE設定複数ファイルの許可ONに変更します。ページ・アイテムP1_IMAGE、P1_FILENAME、P1_MIME_TYPEは削除します。


カード・リージョンを作成します。

識別名前画像とします。タイプカードです。ソース位置ローカル・データベースで、タイプSQL問合せとします。SQL問合せとして以下を記述します。

select id, blob_content, filename, mime_type
from apex_application_temp_files
where name in
(
select column_value
from apex_string.split(:P1_FILE, ':')
)


カード・リージョンのAttributesとして、カード主キー列1IDタイトルFILENAMEサブタイトルとしてMIME_TYPEを指定します。


メディアソースBLOB列とし、BLOB列BLOB_CONTENTを指定します。BLOB属性MIMEタイプ列MIME_TYPEを指定します。


以上で複数ファイルのアップロードと表示を行うアプリケーションは作成できました。ページを実行し、複数の画像ファイルを選択すると、以下のように表示されます。


APEXの一時表APEX_APPLICATION_TEMP_FILESの使い方の紹介は以上になります。

ひとつの画像を表示するアプリケーションのエクスポートは以下です。
https://github.com/ujnak/apexapps/blob/master/exports/image-viewer-single.sql

複数の画像を表示するアプリケーションのエクスポートは以下です。
https://github.com/ujnak/apexapps/blob/master/exports/image-viewer-multi.sql

Oracle APEXのアプリケーション作成の参考になれば幸いです。