2020年2月28日金曜日

APEXからOCIオブジェクト・ストレージを操作する(7) - ファイルのアップロード

ファイルをOCIオブジェクト・ストレージにアップロードする画面を作成します。
 


ファイルをアップロードするダイアログ画面の作成



まず、空のページを作成します。開発中のアプリケーションのホームより、ページの作成を実行します。


ページ・タイプコンポーネントを選んで、空白ページを作成します。アイコンをクリックするか、選択してへ進みます。
 

ページ番号は(必ず2にしてください。後続のページ・アイテム名などに影響します)、名前File Uploadページ・モードモーダル・ダイアログを指定して、ページの作成をクリックします。モーダル・ダイアログなので、ブレッドクラム、ナビゲーションはOFFのままにします。
 

作成されたページに2つの静的コンテンツのリージョンを追加します。

Content BodyタイトルFile Uploadタイプ静的コンテンツのリージョンを追加します。
 

Dialog FooterタイトルButtonsタイプ静的コンテンツのリージョンを追加します。外観/テンプレートとして、Buttons Containerを選択します。
 

File Uploadとして作成したリージョンに、タイプ非表示のページ・アイテムP2_BUCKET_NAMEを追加します。
 

次にタイプファイル参照...であるページ・アイテムP2_FILEを追加します。記憶タイプTable APEX_APPLICATION_TEMP_FILESとなっていることを確認します。ラベルFileとします。
 

Buttonsとして作成したリージョンに、ボタンを追加します。左ペインのレンダリング・ツリーにあるリージョンButtonsの上でコンテキスト・メニューを表示し、ボタンの作成を実行します。右ペインのプロパティ・エディタにて、識別ボタン名UPLOAD識別ラベルUpload、そして動作アクションとしてページの送信を指定します。
 

同様にボタンCANCELも作成します。識別ボタン名CANCEL識別ラベルCancel、そしてこちらの動作アクション動的アクションで定義を指定します。
 

ボタンCANCELに動的アクションを定義します。レンダリング・ツリーのCANCELボタンの上でコンテキスト・メニューを表示させ、そのメニューから動的アクションの作成を実行します。
 

動的アクションの識別/名前は任意の値でかまわないのですが、ここではClick CANCELを指定します。タイミングはデフォルトで(CANCELボタンのコンテキスト・メニューから動的アクションを作成したため)、イベントクリック選択タイプボタンボタンCANCELとなっているはずですが、確認してください。
 

実行するTrueアクションとして、ダイアログを取り消すを選択します。
 

左ペインにてプロセス・ビューの表示を選択し、プロセス・ビューのプロセス上でコンテキスト・メニューを開き、プロセスの作成を実行します。


作成したプロセスの識別名前uploadFileタイプコードを実行とします。ソースは位置ローカル・データベース、そしてPL/SQLコードとして以下を記述します。

declare
l_request_url varchar2(32767);
l_content_length number;
l_response clob;
upload_failed_exception exception;
begin
for file in (
select * from apex_application_temp_files
where name = :P2_FILE
) loop
l_request_url := :G_BASE_URL || 'b/' || :P2_BUCKET_NAME
|| '/o/' || utl_url.escape(file.filename, false, 'AL32UTF8');
apex_web_service.g_request_headers(1).name :=
'Content-Type';
apex_web_service.g_request_headers(1).value :=
file.mime_type;
l_response := apex_web_service.make_rest_request(
p_url => l_request_url
, p_http_method => 'PUT'
, p_body_blob => file.blob_content
, p_credential_static_id => :G_OCI_WEB_CREDENTIAL
);
if apex_web_service.g_status_code != 200 then
raise upload_failed_exception;
end if;
end loop;
end;
view raw uploadFile.sql hosted with ❤ by GitHub

元にしているブログのコードに、日本語の対応(apex_util.url_encodeの代わりにutl_url.escapeを使用)を追加しています。
 

続いて同様にプロセスを作成し、識別/名前としてcloseDialogタイプダイアログを閉じるを指定します。これにより、プロセスuploadFileの次にcloseDialogが実行され、本ダイアログ・ページが閉じて、ホーム画面に戻ります。
 

ここまででファイルのアップロードを行うページの作成が完了したので、保存を実行しておきましょう。

通常、ページが送信されたときに実行されるプロセスには、サーバー側の条件にて、どのボタン押下時なのか、条件としてボタンを指定しますが、今回の例ではUPLOADしかページ送信を行うボタンがないため省略しています。

uploadFileで指定したPL/SQLコードの中で、G_BASE_URLG_OCI_WEB_CREDENTIALという置換文字列を使用しています。これはアプリケーションの静的置換文字列として設定します。アプリケーションのトップ・ページにあるアプリケーション定義の編集をクリックします。
 

そして、アプリケーション定義の編集画面を開き、置換のセクションに以下の設定を行います。
  • G_BASE_URL: https://objectstorage.REGION.oraclecloud.com/n/NAMESPACE/(RESTデータ・ソースlist_bucketsのベースURLと同じです)
  • G_OCI_WEB_CREDENTIAL: OCI_API_ACCESS(Web資格証明の静的識別子です)
置換文字列を入力した後、変更の適用をクリックします。
 

ページ番号1のホームを開き、作成したダイアログを開くためのボタンを追加します。

左ペインのレンダリング・ツリーにあるリージョンBucket List上でコンテキスト・メニューを開き、ボタンの作成を実行します。識別ボタン名UPLOAD識別ラベルUploadレイアウトボタン位置Nextを指定し、動作アクションとしてこのアプリケーションのページにリダイレクトを選択します。 ターゲットの指定がリンクが定義されていません、となるので、それをクリックしてリンクを定義します。
 

ターゲットの指定を行うダイアログが表示されるので、ページアイテムの設定として、名前P2_BUCKET_NAME、その&P1_BUCKET_NAME.として設定します。その後OKをクリックします。
 

最後に作成したUPLOADボタンに動的アクションを追加します。UPLOADボタンの上でコンテキスト・メニューを開き、動的アクションの作成を実行します。新規に動的アクションとTrue条件で実行されるアクションが作成されます。動的アクションの識別名前を新規から、任意の値(この例ではClose Dialog)に変更します。タイミングのイベントダイアログのクローズ選択タイプボタンボタンUPLOADとなっていることを確認します。
 

また、True条件で実行されるアクションの識別アクションリフレッシュ影響を受ける要素リージョン、リージョンとしてBucket Contentsを指定します。
 

これでローカルに存在するファイルをOCIオブジェクト・ストレージにアップロードする機能が実装できました。いくつかファイルをアップロードして、動作を確認してみしょう。

続く