2021年2月6日土曜日

ファイルの内容をページ・アイテムに設定する

アイテム・タイプファイルのアップロードのページ・アイテムで選択したファイルの内容を、JavaScriptのFile APIを使って読み出し、異なるページ・アイテムに設定します。

実装例を紹介するために、空のAPEXアプリケーションを作成します。名前File APIとします。


アプリケーションが作成されます。

実装はすべてホーム・ページに対して行います。ページ・デザイナホーム・ページを開きます。

最初にファイルを選択するページ・アイテムを作成します。

名前P1_FILEタイプファイルのアップロードにします。ラベルファイルとします。


続けて、ファイルの内容を保持するページ・アイテムを作成します。名前P1_CONTENTタイプテキスト領域にします。ラベル内容とします。


P1_FILEにファイルが選択されたときに、その内容を読み出す処理は動的アクションにて実装します。

P1_FILEに動的アクションを作成します。

名前onChange P1_FILE、とします。タイミングはデフォルトでアイテムP1_FILE変更されたときに発火するようになっています。


TRUEアクションとしてJavaScriptコードの実行を選択します。設定コードには以下を記述します。

影響を受ける要素選択タイプアイテムアイテムとしてP1_CONTENTを選択します。


ファイルの内容が秘匿性が高い場合は、ページ・アイテムのプロパティを調整します。利用者に情報そのものを見せる必要はないので、タイプ非表示にします。タイプを非表示にしても、動的アクションによって値が設定できるよう、設定保護された値OFFにします。詳細保存されていない変更の警告無視します。ページ移動時に警告なしでP1_CONTENTの内容を破棄します。

セッション・ステートストレージリクエストごと(メモリーのみ)を選択します。


ページの送信時(フォームのページで送信を行ったとき)にページ・アイテムの値はブラウザからサーバーに送信されます。セッションごと(永続)ユーザーごと(永続)を選択している場合は、受信したページ・アイテムの値をデータベースに保存します。結果としてサーバー側で内容を参照できるようになります。リクエストごと(メモリーのみ)の場合は、データベースに保存しません。通常は異なるページに配置されているページ・アイテムの値を参照するコードは書かない(そのような場合はアプリケーション・アイテムを使用する)ので、リクエストごと(メモリーのみ)でデータベースに保存する必要はありません。

Oracle APEXではページ・アイテムをセッション・ステートに保存する際に暗号化するオプションも提供しています。セキュリティセッション・ステートに暗号化された値を保存です。

この設定はデフォルトでオンです。


ファイルの内容をページ・アイテムに設定する方法の紹介は以上になります。

簡単なアプリケーションですが、エクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-file-api.zip

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

 追記

当初、想定していた要件についてはlocalStorageを使うのが正解でした。