Oracle Application Expressアプリケーションには、データベースに格納されているファイルをアップロードおよびダウンロードする機能があります。このチュートリアルでは、ファイルのアップロードおよびダウンロード用のリンクを持つフォームおよびレポートの作成方法、ドキュメントに関する追加属性を格納する表の作成および移入方法、カスタム表にドキュメントをダウンロードするメカニズムの作成方法について説明します。
この項には、次の項目が含まれます。
このトピックに関するその他の例は、次に示すOracle by Examples (OBE)を参照してください。
Oracle Application Express 3.1でのBLOBデータの定義および表示
http://www.oracle.com/technology/obe/apex/apex31nf/apex31blob.htm
最初に、ページ1にアップロード・フォームを含めると想定して、「アプリケーションの作成」ウィザードを使用して新しいアプリケーションを作成します。
「アプリケーションの作成」ウィザードでアプリケーションを作成するには、次のステップを実行します。
「ワークスペース」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
「アプリケーション・ビルダー」ホームページが表示されます。
「作成」をクリックします。
「アプリケーションの作成」を選択して「次へ」をクリックします。
「名前」で、次の各項目を指定します。
「名前」に、Download App
と入力します。
残りのデフォルトを受け入れて「次へ」をクリックします。
次のステップで空白ページを追加します。
「ページ・タイプの選択」で「空白」を選択し、「ページの追加」をクリックします。
ページ上部の「アプリケーションの作成」リストに、新しいページが表示されます。
「次へ」をクリックします。
「タブ」で、デフォルトの「1レベルのタブ」を受け入れて「次へ」をクリックします。
「別のアプリケーションから共有コンポーネントのコピー」で、デフォルトの「いいえ」を受け入れて「次へ」をクリックします。
「属性」で、「認証スキーム」、「言語」、「ユーザー言語プリファレンスの派生元」にデフォルトを受け入れて、「次へ」をクリックします。
「ユーザー・インタフェース」で、「テーマ2」を選択して「次へ」をクリックします。
選択内容を確認して、「作成」をクリックします。
「アプリケーション」ホームページが表示されます。
アプリケーションを作成した後、次のステップでは、ドキュメントをアップロードするフォームを作成します。次の演習では、HTMLリージョンに、ファイルのアップロード・アイテムとボタンが含まれるフォームを作成します。ボタンによって、ページが送信され、ユーザーが同じページに戻されます。
この項の内容は次のとおりです。
最初に、フォームを保持するコンテナを作成する必要があります。アプリケーション・ビルダーでは、このコンテナはリージョンと呼ばれます。
HTMLリージョンを作成するには、次のステップを実行します。
「ページ1」アイコンをクリックします。
ページ定義が表示されます。
図9-1に示すように、「リージョン」で、「作成」アイコンをクリックします。
「リージョン」で、次のステップを実行します。
「このページに追加するリージョン・タイプを指定」で、デフォルトの「HTML」を受け入れ、「次へ」をクリックします。
「作成するHTMLリージョン・コンテナのタイプの選択」で、デフォルトの「HTML」を受け入れ、「次へ」をクリックします。
「表示属性」で、次のステップを実行します。
「タイトル」に、Submit File
と入力します。
残りのデフォルトを受け入れて「次へ」をクリックします。
残りのデフォルトを受け入れて「リージョンを作成」をクリックします。
ページ定義が表示されます。
次に、テキスト・フィールドまたはアイテムを作成する必要があります。アプリケーション・ビルダーでは、アイテムは、HTMLフォームの一部です。アイテムは、テキスト・フィールド、テキスト領域、パスワード、選択リスト、チェック・ボックスなどを示します。次の演習では、ファイル参照アイテムを作成します。ファイル参照アイテムを作成すると、アップロードしたファイルはwwv_flow_file_objects$
と呼ばれる表に格納されます。
ファイルのアップロード・アイテムを作成するには、次のステップを実行します。
ページ1のページ定義の「アイテム」で、「作成」アイコンをクリックします。
「アイテム・タイプ」で、「ファイル参照」を選択して「次へ」をクリックします。
「表示位置および名前」で、次のステップを実行します。
「アイテム名」に、P1_FILE_NAME
と入力します。
「順序」で、デフォルトを受け入れます。
「リージョン」で、「Submit File」を選択します。
「次へ」をクリックします。
残りのデフォルトを受け入れて「次へ」をクリックします。
「アイテムの作成」をクリックします。
ページ定義が表示されます。
次に、ファイルを送信するボタンを作成する必要があります。
ボタンを作成するには、次のステップを実行します。
「ボタン」で、「作成」アイコンをクリックします。
「ボタン・リージョン」で、「ファイルの送信 (1) 1」を選択して「次へ」をクリックします。
「ボタン位置」で、「リージョン位置にボタンを作成」を選択して「次へ」をクリックします。
「ボタン属性」で、次のステップを実行します。
「ボタン名」に、送信
と入力します。
残りのデフォルトを受け入れます。
「次へ」をクリックします。
「ボタン・テンプレート」で、デフォルトを受け入れて「次へ」をクリックします。
「表示プロパティ」で、デフォルトを受け入れて「次へ」をクリックします。
「ブランチ」で、次のステップを実行します。
「ページにブランチ」で、「ページ1」を選択します。
このように選択すると、送信によって別のページにナビゲートされるのではなく、このページ自体がコールされます。
「ボタンの作成」をクリックします。
図9-2に示すように、「ページの実行」アイコンをクリックしてページを実行します。
ユーザー名およびパスワードを入力するように要求されたら、ワークスペースのユーザー名およびパスワードを入力して、「ログイン」をクリックします。詳細は、「アプリケーション認証の概要」を参照してください。
ページを実行すると、図9-3のように表示されます。
ドキュメントをアップロードするフォームを作成したら、次のステップでは、アップロードされたドキュメントへのリンクを含むドキュメント表のレポートを作成します。ファイル参照アイテムを使用すると、アップロードしたファイルはwwv_flow_file_objects$
と呼ばれる表に格納されます。すべてのワークスペースは、APEX_APPLICATION_FILES
と呼ばれるビューを介した、この表へのアクセス権を所有しています。
この項の内容は次のとおりです。
APEX_APPLICATION_FILES
のレポートを作成するには、次のステップを実行します。
ページ下部の「開発者」ツールバーの「ページの編集1」をクリックします。
ページ定義が表示されます。
「リージョン」で、「作成」アイコンをクリックします。
「リージョン」で、「レポート」を選択して「次へ」をクリックします。
「レポート実装」で、「SQLレポート」を選択して「次へ」をクリックします。
「表示属性」で、次のステップを実行します。
「タイトル」に、Uploaded Files
と入力します。
残りのデフォルトを受け入れて「次へ」をクリックします。
「ソース」で、次のSQL問合せを入力します。
SELECT id,name FROM APEX_APPLICATION_FILES
「リージョンの作成」をクリックします。
ページを実行します。
図9-4のようなレポートが表示されます。どのファイルをアップロードしたかによって、表示される内容が多少異なる場合があります。
次に、各ドキュメントをダウンロードするリンクを設定する必要があります。
ドキュメントをダウンロードするリンクをレポートに設定するには、次のステップを実行します。
「開発者」ツールバーで「ページの編集1」をクリックします。
図9-5に示すように、「リージョン」で、「Uploaded Files」の横にある「レポート」をクリックします。
「レポート属性」ページが表示されます。「列属性」を編集してID列にリンクを追加できます。
「列属性」で、ID行内の「編集」アイコンをクリックします。
「列リンク」までスクロールします。
「列リンク」で、次のステップを実行します。
「リンク・テキスト」で、「#ID#
」を選択します。
「ターゲット」で、「URL」を選択します。
「URL」フィールドに、次のように入力します。
p?n=#ID#
#ID#
は、列のエイリアスがID
である列に含まれる値を渡します。
ページ上部の「変更の適用」をクリックします。
ページを実行します。
ページを実行すると、図9-6のように表示されます。
リンクをテストするには、IDをクリックします。
「ファイルのダウンロード」ダイアログ・ボックスが表示されます。
「開発者」ツールバーの「ページの編集1」をクリックして、ページ定義に戻ります。
次に、アップロードするドキュメントに関する追加情報を格納する別の表を作成します。この例では、次のステップを実行します。
情報を取得するためのアイテムをアップロード・フォームに追加します。
ファイル名とともに、この情報を挿入するプロセスを追加します。
アップロード済ファイルのSQLレポートを変更して、追加情報を含む表に結合します。
この項の内容は次のとおりです。
最初に、「SQLコマンド」に表を作成します。
関連項目: 『Oracle Database Application Expressユーザーズ・ガイド』の「SQLコマンドの使用」 |
アップロード済ファイルに関する追加情報を格納する表を作成するには、次のステップを実行します。
「SQLコマンド」に移動します。
図9-7に示すように、ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。
「ワークスペース」ホームページが表示されます。
「ワークスペース」ホームページで「SQLワークショップ」をクリックして、「SQLコマンド」をクリックします。
「SQLコマンド」ページが表示されます。
上部のセクションに、次のように入力します。
CREATE TABLE oehr_file_subject (name VARCHAR2(4000) primary key, subject VARCHAR2(4000));
「実行」をクリックします。
「Table created
」というメッセージが「結果」セクションに表示されます。
「ホーム」ブレッドクラム・リンクをクリックします。
「ワークスペース」ホームページが表示されます。
ドキュメントの件名を取得するアイテムを作成するには、次のステップを実行します。
ページ1のページ定義に移動します。
「ワークスペース」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
「アプリケーション・ビルダー」ホームページで、「Download App」をクリックします。
「アプリケーション」ホームページで、「ページ1」アイコンをクリックします。
ページ1のページ定義が表示されます。
「アイテム」で、「作成」アイコンをクリックします。
「アイテム・タイプ」で、「テキスト」を選択して「次へ」をクリックします。
「テキスト制御の表示タイプ」で、「テキスト・フィールド」を選択して「次へ」をクリックします。
「表示位置および名前」で、次のステップを実行します。
「アイテム名」に、P1_SUBJECT
と入力します。
「順序」で、デフォルトを受け入れます。
「リージョン」で、「Uploaded Files」を選択します。
「次へ」をクリックします。
「アイテム属性」で、次のステップを実行します。
「ラベル」フィールドに、Subject
と入力します。
残りのデフォルトを受け入れます。
「次へ」をクリックします。
「アイテムの作成」をクリックします。
次に、件名情報を新しい表に挿入するプロセスを作成する必要があります。
プロセスを作成するには、次のステップを実行します。
「ページ・プロセス」の「プロセス」で、「作成」アイコンをクリックします。
「プロセス・タイプ」で、「PL/SQL」を選択して「次へ」をクリックします。
「プロセス属性」で、次のステップを実行します。
「名前」に、Insert file description
と入力します。
「順序」で、デフォルトを受け入れます。
「ポイント」で、「送信時 - 計算および検証の後」を選択します。
「次へ」をクリックします。
「PL/SQLページ・プロセスの入力」に、次のように入力します。
INSERT INTO oehr_file_subject(name, subject) VALUES(:P1_FILE_NAME,:P1_SUBJECT);
「次へ」をクリックします。
「メッセージ」で、次のステップを実行します。
「成功メッセージ」に、次のように入力します。
Subject inserted
「失敗メッセージ」に、次のように入力します。
Error inserting subject
「次へ」をクリックします。
「プロセス条件」で、次のステップを実行します。
「対象ボタン」で、「送信」を選択します。
残りのデフォルトを受け入れて「プロセスの作成」をクリックします。
最後に、SQLレポート・リージョンを変更して追加属性表に結合する必要があります。これを行うには、「リージョン定義」ページで「リージョン・ソース」属性を編集します。
「リージョン・ソース」を編集するには、次のステップを実行します。
「リージョン」で、「Uploaded Files」をクリックします。
リージョン定義が表示されます。
「ソース」までスクロールします。
リージョン・ソースを次と置き換えます。
SELECT w.id,w.name,s.subject FROM APEX_APPLICATION_FILES w,oehr_file_subject s WHERE w.name = s.name
「変更の適用」をクリックします。
ページを実行します。
「参照」をクリックしてアップロードするファイルを検索し、「送信」をクリックします。
図9-8に示すように、「Uploaded Files」レポートには、Subject列が表示されるようになります。
「開発者」ツールバーの「ページの編集1」をクリックして、ページ定義に戻ります。
アップロード済ドキュメントを自分のスキーマが所有する表に格納する場合があります。たとえば、アップロード済ドキュメントにOracle Text索引を作成する場合、ドキュメントはカスタム表に格納する必要があります。
カスタム表にドキュメントを格納するには、次のステップを実行します。
ドキュメントを格納するBLOB
型の列を追加します。
プロセスを変更して、カスタム表にドキュメントを挿入します。
BLOB列をoehr_file_subject
表に追加するには、次のステップを実行します。
「SQLコマンド」に移動します。
ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。
「ワークスペース」ホームページが表示されます。
「ワークスペース」ホームページで「SQLワークショップ」をクリックして、「SQLコマンド」をクリックします。
「SQLコマンド」ページが表示されます。
上部のセクションに、次のSQL文を入力します。
ALTER TABLE oehr_file_subject ADD(id number,blob_content BLOB,mime_type varchar2(4000) );
「実行」をクリックします。
「Table Altered
」というメッセージが表示されます。
ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。
oehr_file_subject
表にドキュメントが挿入されるようにプロセスを変更するには、次のステップを実行します。
「ワークスペース」ホームページで、「アプリケーション・ビルダー」をクリックします。
「Download App」をクリックします。
「ページ1」をクリックします。
「プロセス」で、「Insert file description」リンクをクリックします。
「ソース」までスクロールします。
「ソース」で、プロセスを次のコードと置き換えます。
IF ( :P1_FILE_NAME is not null ) THEN INSERT INTO oehr_file_subject(id,NAME, SUBJECT, BLOB_CONTENT, MIME_TYPE) SELECT ID,:P1_FILE_NAME,:P1_SUBJECT,blob_content,mime_type FROM APEX_APPLICATION_FILES WHERE name = :P1_FILE_NAME; DELETE from APEX_APPLICATION_FILES WHERE name = :P1_FILE_NAME; END IF;
「変更の適用」をクリックします。
ドキュメントがカスタム表に格納されるようになると、ドキュメントをダウンロードする方法を指定する必要があります。これを行うには、プロシージャを作成して、そのプロシージャに対する実行権限を擬似ユーザーAPEX_PUBLIC_USER
に付与します。
これを実行するには、次の内容を変更する必要があります。
APEX_APPLICATION_FILES
ビューに結合されなくなったSQLレポート・リージョン
SQLレポートのID列に指定されたURL(以前のプロシージャを実行するかわりに、新しいプロシージャを実行するため)
この項の内容は次のとおりです。
oehr_file_subject
表からのドキュメントのダウンロード、およびpublicへの実行権限の付与を行うプロシージャを作成するには、次のステップを実行します。
「SQLコマンド」に移動します。
ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。
「ワークスペース」ホームページが表示されます。
「ワークスペース」ホームページで「SQLワークショップ」をクリックして、「SQLコマンド」をクリックします。
「SQLコマンド」ページが表示されます。
次のSQL文を入力します。
CREATE OR REPLACE PROCEDURE download_my_file(p_file in number) AS v_mime VARCHAR2(48); v_length NUMBER; v_file_name VARCHAR2(2000); Lob_loc BLOB; BEGIN SELECT MIME_TYPE, BLOB_CONTENT, name,DBMS_LOB.GETLENGTH(blob_content) INTO v_mime,lob_loc,v_file_name,v_length FROM oehr_file_subject WHERE id = p_file; -- -- set up HTTP header -- -- use an NVL around the mime type and -- if it is a null set it to application/octect -- application/octect may launch a download window from windows owa_util.mime_header( nvl(v_mime,'application/octet'), FALSE ); -- set the size so the browser knows how much to download htp.p('Content-length: ' || v_length); -- the filename will be used by the browser if the users does a save as htp.p('Content-Disposition: attachment; filename="'||replace(replace(substr(v_file_name,instr(v_file_name,'/')+1),chr(10),null),chr(13),null)|| '"'); -- close the headers owa_util.http_header_close; -- download the BLOB wpg_docload.download_file( Lob_loc ); end download_my_file; /
「実行」をクリックします。
「Procedure Created
」というメッセージが表示されます。
次に、別のSQL文を実行します。
「SQLワークショップ」ブレッドクラム・リンクをクリックして、「SQLコマンド」をクリックします。
「SQLコマンド」ページが表示されます。
上部のセクションで、既存のSQL文を次のように置き換えます。
GRANT EXECUTE ON download_my_file TO PUBLIC/
「実行」をクリックします。
「Statement processed
」というメッセージが表示されます。
ページ上部の「ホーム」ブレッドクラム・リンクをクリックして、「ワークスペース」ホームページに戻ります。
SQLレポート・リージョンを変更して、APEX_APPLICATION_FILES
ビューと結合しないようにするには、次のステップを実行します。
ページ1のページ定義に移動します。
「ワークスペース」ホームページで、「アプリケーション・ビルダー」をクリックします。
「アプリケーション・ビルダー」ホームページで、「Download App」をクリックします。
「アプリケーション」ホームページで、「ページ1」をクリックします。
「リージョン」で、「Uploaded Files」をクリックします。
「ソース」までスクロールします。
リージョン・ソースを次と置き換えます。
SELECT s.id,s.name,s.subject FROM oehr_file_subject s
「変更の適用」をクリックします。
ページ定義が表示されます。
次に、PL/SQL download_my_fileプロシージャをコールするためのダウンロード・リンクを変更する必要があります。
注意: Application ExpressをDatabase 11gで使用している場合は、この項の説明に従ってPL/SQLプロシージャをコールするのではなく、「埋込みPL/SQLゲートウェイ用の「ダウンロード」ページの作成」で説明されているステップを実行してください。 |
ダウンロード・リンクを変更して、新しいダウンロード・プロシージャを使用するには、次のステップを実行します。
「リージョン」で、「Uploaded Files」の横にある「レポート」をクリックします。
ID行で、「編集」アイコンをクリックします。
「列リンク」セクションまでスクロールします。
「URL」フィールドで、既存のURLを次のように置き換えます。
#OWNER#.download_my_file?p_file=#ID#
このURLの内容は、次のとおりです。
#OWNER#
は、カレント・アプリケーションを解析しているスキーマです。
download_my_file
は、作成した新しいプロシージャです。
列IDの値をパラメータp_file
に渡します。
「変更の適用」をクリックします。
ページ定義が表示されます。
通常、Oracle Database 11gのApplication Expressに対しては、埋込みPL/SQLゲートウェイが含まれているOracle XML DB HTTP Serverが使用されます。「新規プロシージャを使用するためのダウンロード・リンクの変更」で説明されているように、実行可能なプロシージャのリストに示されていないPL/SQLプロシージャをURLから直接コールすると、エラー・メッセージが表示されます。
この状況を回避するために使用可能な方法は2つあります。1つ目の方法は、PL/SQL download_my_file
プロシージャが含まれるようにPL/SQLファンクションWWV_FLOW_EPG_INCLUDE_MOD_LOCAL
を変更してから再コンパイルする方法です。2つ目の方法は、次に示すように、PL/SQL download_my_file
プロシージャへのヘッダー前ブランチが含まれているページをアプリケーションに作成する方法です。その後、このページに、ダウンロードするドキュメントのドキュメントIDに対する非表示アイテムを作成します。
2つ目の方法を行うには、次の操作を実行する必要があります。
PL/SQLプロシージャdownload_my_fileへのヘッダー前ブランチが含まれているページの作成
新しいページを使用してファイルを表示するためのダウンロード・リンクの変更
PL/SQLプロシージャdownload_my_fileへのヘッダー前ブランチが含まれているページを作成するには、次のステップを実行します。
「アプリケーション」ホームページで、「ページの作成」をクリックします。
「空白ページ」を選択して「次へ」をクリックします。
「ページ番号」に2と入力して、「次へ」をクリックします。
「名前」にDownload Fileと入力して、「次へ」をクリックします。
「タブ」で、「いいえ」を選択して「次へ」をクリックします。
「終了」をクリックします。
「成功」ページが表示されます。
「ページの編集」アイコンをクリックします。
ページ2のページ定義が表示されます。
「リージョン」で、「作成」アイコンをクリックします。
「リージョン」で、次のステップを実行します。
「このページに追加するリージョン・タイプを指定」で、デフォルトの「HTML」を受け入れ、「次へ」をクリックします。
「作成するHTMLリージョン・コンテナのタイプの選択」で、デフォルトの「HTML」を受け入れ、「次へ」をクリックします。
「表示属性」で、次の各項目を指定します。
「タイトル」に、Display Document
と入力します。
残りのデフォルト値を受け入れます。
「次へ」をクリックします。
「リージョンの作成」をクリックします。
ページ2のページ定義が表示されます。ページ上部に「リージョンが作成されました。」という確認メッセージが表示されます。
ページ2のページ定義の「アイテム」で、「作成」アイコンをクリックします。
「アイテム・タイプ」で、「非表示」を選択して「次へ」をクリックします。
「非表示のアイテム・タイプ」で、「非表示で保護」を選択して「次へ」をクリックします。
「アイテム名」で、P2_DOC_IDと入力して「次へ」をクリックします。
「ソース」で、すべてのデフォルトを受け入れて「アイテムの作成」をクリックします。
ページ2のページ定義が表示されます。
「ブランチ」で、「作成」アイコンをクリックします。
「ブランチ・ポイント」リストで、「ロード時: ヘッダーの前」を選択します。
「ブランチ・タイプ」で、「PL/SQLプロシージャにブランチ」を選択して「次へ」をクリックします。
コールするPL/SQLプロシージャを指定するテキスト・ボックスに、download_my_file(:P2_DOC_ID)
と入力します。
「ブランチ条件」で、デフォルト値を受け入れて「ブランチの作成」をクリックします。
ページ2のページ定義が表示されます。
「ダウンロード表示」ページに表示するためのダウンロード・リンクの変更
「ページ1」アイコンをクリックします。
ページ1のページ定義が表示されます。
「リージョン」で、「Uploaded Files」の横にある「レポート」をクリックします。
「レポート属性」ページが表示されます。
「列属性」で、ID行内の「編集」アイコンをクリックします。
「列リンク」までスクロールして、次のステップを実行します。
「列リンク」で、次のステップを実行します。
「ターゲット」で、「このアプリケーションのページ」を選択します。
「ページ」に、2と入力します。
「アイテム1の名前」に、P2_DOC_ID
と入力します。
「アイテム1の値」に、#ID#
と入力します。
「変更の適用」をクリックします。
アプリケーションを実行します。
このチュートリアルで構築するアプリケーションでは、プロシージャdownload_my_file
を起動するダウンロード・リンクが提供されます。この方法には、注意の必要があるセキュリティ上の問題があります。
自分のプロシージャを、他のユーザーが、提供されているリンクをクリックするか、またはWebブラウザの「アドレス」(または「ロケーション」)フィールドに同様のURLを入力して起動することができます。好奇心旺盛なユーザーまたは悪意のあるユーザーは、任意のファイルIDをp_file
引数として渡してdownload_my_file
プロシージャを試行する可能性があることに注意してください。ハッカーは、合法または非合法の手段を用いて表に存在するファイルIDを特定できます。さらに、ハッカーは、IDが表内のファイルに一致してファイルがプロシージャによってダウンロードされるまで、機械化された攻撃で連続してIDを送信できます。
不正アクセスからデータを保護するための対策は、次の要因によって異なります。
ハッカーがファイルをダウンロードした場合の損害の程度。
攻撃と、その攻撃に対する制御のコストおよび問題とのバランス。
アプリケーションを保護するために使用可能な方法の1つとして、プロシージャ内からOracle Application ExpressのいずれかのセキュリティAPIをコールしてユーザーがすでに認証されていることを確認する方法があります。たとえば、コードのブロックを、最初に実行されるようにプロシージャに含めることができます。次に例を示します。
-- Assuming your application's numeric ID is 100, set g_flow_id to -- that value, otherwise change the value as required. -- APEX_APPLICATION.G_FLOW_ID := 100; IF NOT wwv_flow_custom_auth_std.is_session_valid then -- -- -- display this message or a custom message. -- htp.p('Unauthorized access - file will not be retrieved.'); -- -- You can do whatever else you need to here to log the -- unauthorized access attempt, get the requestor's -- IP address, send email, etc. -- RETURN; END IF;