Oracle Application Expressアプリケーションには、データベースに格納されているファイルをアップロードおよびダウンロードする機能を含めることができます。このチュートリアルでは、ファイルのアップロードおよびダウンロード用のリンクを持つフォームおよびレポートの作成方法、ドキュメントに関する追加属性を格納する表の作成および移入方法、カスタム表にドキュメントをダウンロードするメカニズムの作成方法について説明します。
内容は次のとおりです。
最初に、ページ2にアップロード・フォームを含めると想定して、「アプリケーションの作成」ウィザードを使用して新しいアプリケーションを作成します。
「アプリケーションの作成」ウィザードでアプリケーションを作成するには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
「アプリケーション・ビルダー」ホームページが表示されます。
「作成」をクリックします。
「アプリケーションの作成」を選択して「次へ」をクリックします。
ページ名を指定します。
「名前」に、Download App
と入力します。
残りのデフォルトを受け入れて「次へ」をクリックします。
次のステップで空白ページを追加します。
図9-1に示すように、「ページ・タイプの選択」で、「空白」を選択して「ページの追加」をクリックします。
図9-1 ページの追加
ページ上部の「アプリケーションの作成」リストに、新しいページが表示されます。
「次へ」をクリックします。
「タブ」で、デフォルトの「1レベルのタブ」を受け入れて「次へ」をクリックします。
「別のアプリケーションから共有コンポーネントのコピー」で、デフォルトの「いいえ」を受け入れて「次へ」をクリックします。
「属性」で、「認証スキーム」、「言語」、「ユーザー言語プリファレンスの派生元」にデフォルトを受け入れて、「次へ」をクリックします。
「ユーザー・インタフェース」で、「テーマ2」を選択して「次へ」をクリックします。
選択内容を確認して、「作成」をクリックします。
「アプリケーション」ホームページが表示されます。
アプリケーションを作成した後、次のステップでは、ドキュメントをアップロードするフォームを作成します。次の演習では、HTMLリージョンに、ファイルのアップロード・アイテムとボタンが含まれるフォームを作成します。ボタンによって、ページが送信され、ユーザーが同じページに戻されます。
このセクションの内容は次のとおりです。
最初に、フォームを保持するコンテナを作成する必要があります。 アプリケーション・ビルダーでは、このコンテナはリージョンと呼ばれます。
HTMLリージョンを作成するには、次のステップを実行します。
「ページ1」アイコンをクリックします。
ページ定義が表示されます。
図9-2に示すように、「リージョン」で、「作成」アイコンをクリックします。
図9-2 「作成」アイコン
「リージョン」で、「HTML」を選択して「次へ」をクリックします。
「表示属性」で、次のステップを実行します。
「タイトル」に、ファイルの送信
と入力します。
残りのデフォルトを受け入れて「次へ」をクリックします。
残りのデフォルトを受け入れて「リージョンを作成」をクリックします。
ページ定義が表示されます。
次に、テキスト・フィールドまたはアイテムを作成する必要があります。 アプリケーション・ビルダーでは、アイテムは、HTMLフォームの一部です。アイテムは、テキスト・フィールド、テキスト領域、パスワード、選択リスト、チェック・ボックスなどを示します。
ファイルのアップロード・アイテムを作成するには、次のステップを実行します。
ページ1のページ定義の「アイテム」で、「作成」アイコンをクリックします。
「アイテム・タイプ」で、「ファイル参照」を選択して「次へ」をクリックします。
「表示位置および名前」で、次のステップを実行します。
「アイテム名」に、P1_FILE_NAME
と入力します。
「順序」で、デフォルトを受け入れます。
「リージョン」で、「ファイルの送信」を選択します。
「次へ」をクリックします。
残りのデフォルトを受け入れて「次へ」をクリックします。
「アイテムの作成」をクリックします。
ページ定義が表示されます。
次に、ファイルを送信するボタンを作成する必要があります。
ボタンを作成するには、次のステップを実行します。
「ボタン」で、「作成」アイコンをクリックします。
「ボタン・リージョン」で、「ファイルの送信 (1) 1」を選択して「次へ」をクリックします。
「ボタン位置」で、「リージョン位置にボタンを作成」を選択して「次へ」をクリックします。
「ボタン属性」で、次のステップを実行します。
「ボタン名」に、Submit
と入力します。
残りのデフォルトを受け入れます。
「次へ」をクリックします。
「ボタン・テンプレート」で、デフォルトを受け入れて「次へ」をクリックします。
「表示プロパティ」で、デフォルトを受け入れて「次へ」をクリックします。
「ブランチ」で、次のステップを実行します。
「ページにブランチ」で、「ページ1」を選択します。
「ボタンの作成」をクリックします。
図9-3に示すように、「ページの実行」アイコンをクリックしてページを実行します。
図9-3 「ページの実行」アイコン
ユーザー名およびパスワードを入力するように要求されたら、作業領域の資格証明を入力して、「ログイン」をクリックします。
ページを実行すると、図9-4のように表示されます。
ドキュメントをアップロードするフォームを作成した後、次のステップでは、ドキュメントをダウンロードするリンクを含むドキュメント表のレポートを作成します。 ファイル・アップロードのアイテム・タイプを使用すると、アップロードするファイルはwwv_flow_file_objects$
と呼ばれる表に格納されます。 すべての作業領域は、APEX_APPLICATION_FILES
と呼ばれるビューを介した、この表へのアクセス権を所有しています。
このセクションの内容は次のとおりです。
APEX_APPLICATION_FILES
のレポートを作成するには、次のステップを実行します。
「開発者」ツールバーで「ページ1の編集」をクリックします。
「リージョン」で、「作成」アイコンをクリックします。
「リージョン」で、「レポート」を選択して「次へ」をクリックします。
「レポート実装」で、「SQLレポート」を選択して「次へ」をクリックします。
「表示属性」で、次のステップを実行します。
「タイトル」に、Uploaded Files
と入力します。
残りのデフォルトを受け入れて「次へ」をクリックします。
「ソース」で、次のSQL問合せを入力します。
SELECT id,name FROM APEX_APPLICATION_FILES
「リージョンの作成」をクリックします。
ページを実行します。
図9-5に示すように、作成したレポートに、アップロードされたすべてのドキュメントが表示されます。
次に、各ドキュメントをダウンロードするリンクを設定する必要があります。
ドキュメントをダウンロードするリンクをレポートに設定するには、次のステップを実行します。
「開発者」ツールバーで「ページ1の編集」をクリックします。
図9-6に示すように、「リージョン」で、「Uploaded Files」の横にある「レポート」をクリックします。
図9-6 「レポート」リンク
「レポート属性」ページが表示されます。 「レポート属性」を編集してID列にリンクを追加できます。
「列属性」で、ID
行内の「編集」アイコンをクリックします。
「列リンク」までスクロールします。
「列リンク」で、次のステップを実行します。
「リンク・テキスト」フィールドに、次のように入力します。
download
「ターゲット」で、「URL」を選択します。
「URL」フィールドに、次のように入力します。
p?n=#ID#
#ID#
は、列のエイリアスがID
である列に含まれる値を渡します。
ページ上部の「変更の適用」をクリックします。
ページ定義が表示されます。
ページを実行します。
ページを実行すると、図9-7のように表示されます。
図9-7 ダウンロード・リンク付きの「Uploaded Files」レポート
「開発者」ツールバーの「ページ1の編集」をクリックして、ページ定義に戻ります。
図9-8に示すように、ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。
次に、アップロードするドキュメントに関する追加情報を格納する別の表を作成します。 この例では、次のステップを実行します。
情報を取得するためのアイテムをアップロード・フォームに追加します。
ファイル名とともに、この情報を挿入するプロセスを追加します。
アップロード済ファイルのSQLレポートを変更して、追加情報を含む表に結合します。
このセクションの内容は次のとおりです。
最初に、「SQLコマンド」に表を作成します。
参照: 『Oracle Database Application Expressユーザーズ・ガイド』の「SQLコマンドの使用」 |
アップロード済ファイルに関する追加情報を格納する表を作成するには、次のステップを実行します。
「作業領域」ホームページで「SQLワークショップ」をクリックして、「SQLコマンド」をクリックします。
「SQLコマンド」ページが表示されます。
上部のセクションに、次のように入力します。
CREATE TABLE file_subjects(name VARCHAR2(4000), subject VARCHAR2(4000) );
「実行」をクリックします。
「Table created
」というメッセージが表示されます。
「ホーム」ブレッドクラム・リンクをクリックします。
「作業領域」ホームページが表示されます。
ドキュメントの件名を取得するアイテムを作成するには、次のステップを実行します。
ページ1のページ定義にナビゲートします。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
「アプリケーション・ビルダー」ホームページで、「Download App」をクリックします。
「アプリケーション」ホームページで、「ページ1」アイコンをクリックします。
ページ1のページ定義が表示されます。
「アイテム」で、「作成」アイコンをクリックします。
「アイテム・タイプ」で、「テキスト」を選択して「次へ」をクリックします。
「テキスト制御の表示タイプ」で、「テキスト・フィールド」を選択して「次へ」をクリックします。
「表示位置および名前」で、次のステップを実行します。
「アイテム名」に、P1_SUBJECT
と入力します。
「順序」で、デフォルトを受け入れます。
「リージョン」で、「Uploaded Files」を選択します。
「次へ」をクリックします。
「アイテム属性」で、次のステップを実行します。
「ラベル」フィールドに、Subject
と入力します。
残りのデフォルトを受け入れます。
「次へ」をクリックします。
「アイテムの作成」をクリックします。
次に、件名情報を新しい表に挿入するプロセスを作成する必要があります。
プロセスを作成するには、次のステップを実行します。
「ページ・プロセス」の「プロセス」で、「作成」アイコンをクリックします。
「プロセス・タイプ」で、「PL/SQL」を選択して「次へ」をクリックします。
「プロセス属性」で、次のステップを実行します。
「名前」に、Insert
と入力します。
「順序」で、デフォルトを受け入れます。
「ポイント」で、「送信時 - 計算および検証の後」を選択します。
「次へ」をクリックします。
「PL/SQLページ・プロセスの入力」に、次のように入力します。
INSERT INTO file_subjects(name, subject) VALUES(:P1_FILE_NAME,:P1_SUBJECT);
「次へ」をクリックします。
「メッセージ」で、次のステップを実行します。
「成功メッセージ」に、次のように入力します。
Subject inserted
「失敗メッセージ」に、次のように入力します。
Error inserting subject
「次へ」をクリックします。
「プロセス条件」で、次のステップを実行します。
「対象ボタン」で、「SUBMIT」を選択します。
残りのデフォルトを受け入れて「プロセスの作成」をクリックします。
最後に、SQLレポート・リージョンを変更して追加属性表に結合する必要があります。 これを行うには、「リージョン定義」ページで「リージョン・ソース」属性を編集します。
「リージョン・ソース」を編集するには、次のステップを実行します。
「リージョン」で、「Uploaded Files」をクリックします。
リージョン定義が表示されます。
「ソース」までスクロールします。
リージョン・ソースを次と置き換えます。
SELECT w.id,w.name,s.subject FROM APEX_APPLICATION_FILES w,file_subjects s WHERE w.name = s.name
「変更の適用」をクリックします。
ページを実行します。
図9-9に示すように、「Uploaded Files」レポートには、Subject列が表示されるようになります。
図9-9 Subject列が表示されている「Uploaded Files」レポート
最初に、「Uploaded Files」レポートに3つすべての列が表示されない場合は、ファイルをアップロードし、「Submit」ボタンをクリックしてみてください。
「開発者」ツールバーで「ページ1の編集」をクリックします。
ページ上部の「ホーム」ブレッドクラム・リンクをクリックして、「作業領域」ホームページに戻ります。
アップロード済ドキュメントを自分のスキーマが所有する表に格納する場合があります。 たとえば、アップロード済ドキュメントにOracle Text索引を作成する場合、ドキュメントはカスタム表に格納する必要があります。
カスタム表にドキュメントを格納するには、次のステップを実行します。
ドキュメントを格納するBLOB
型の列を追加します。
プロセスを変更して、カスタム表にドキュメントを挿入します。
BLOB列をfile_subjects
表に追加するには、次のステップを実行します。
「作業領域」ホームページで「SQLワークショップ」をクリックして、「SQLコマンド」をクリックします。
「SQLコマンド」ページが表示されます。
上部のセクションに、次のSQL文を入力します。
ALTER TABLE file_subjects ADD(id number,blob_content BLOB,mime_type varchar2(4000) );
「実行」をクリックします。
「Table Altered
」というメッセージが表示されます。
ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。
プロセスを変更して、file_subjects
表にドキュメントを挿入するには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」をクリックします。
「Download App」をクリックします。
「ページ1」をクリックします。
「プロセス」で、「挿入」リンクをクリックします。
「ソース」までスクロールします。
「ソース」で、プロセスを次のコードと置き換えます。
IF ( :P1_FILE_NAME is not null ) THEN INSERT INTO file_subjects(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(以前のプロシージャを実行するかわりに、新しいプロシージャを実行するため)
プロシージャを作成して、file_subjects
表からドキュメントをダウンロードし、実行権限をpublicに付与するには、次のステップを実行します。
「作業領域」ホームページで「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 file_subjects 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 file_subjects s
「変更の適用」をクリックします。
ページ定義が表示されます。
ダウンロード・リンクを変更して、新しいダウンロード・プロシージャを使用するには、次のステップを実行します。
「リージョン」で、「Uploaded Files」の横にある「レポート」をクリックします。
ID行で、「編集」アイコンをクリックします。
「列リンク」セクションまでスクロールします。
既存のURLを次のURLと置き換えます。
#OWNER#.download_my_file?p_file=#ID#
このURLの内容は、次のとおりです。
#OWNER#
は、カレント・アプリケーションを解析しているスキーマです。
download_my_file
は、作成した新しいプロシージャです。
列IDの値をパラメータp_file
に渡します。
「変更の適用」をクリックします。
ページ定義が表示されます。
このチュートリアルで構築するアプリケーションでは、プロシージャ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;