ヘッダーをスキップ
Oracle Database Application Expressアドバンスト・チュートリアル
リリース3.0
E05693-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

9 アプリケーション内のファイルのアップロードおよびダウンロード方法

Oracle Application Expressアプリケーションには、データベースに格納されているファイルをアップロードおよびダウンロードする機能があります。このチュートリアルでは、ファイルのアップロードおよびダウンロード用のリンクを持つフォームおよびレポートの作成方法、ドキュメントに関する追加属性を格納する表の作成および移入方法、カスタム表にドキュメントをダウンロードするメカニズムの作成方法について説明します。

内容は次のとおりです。

アプリケーションの作成

最初に、ページ1にアップロード・フォームを含めると想定して、「アプリケーションの作成」ウィザードを使用して新しいアプリケーションを作成します。

「アプリケーションの作成」ウィザードでアプリケーションを作成するには、次のステップを実行します。

  1. 「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。

    「アプリケーション・ビルダー」ホームページが表示されます。

  2. 作成」をクリックします。

  3. アプリケーションの作成」を選択して「次へ」をクリックします。

  4. 「名前」で、次の各項目を指定します。

    1. 「名前」に、Download Appと入力します。

    2. 残りのデフォルトを受け入れて「次へ」をクリックします。

  5. 次のステップで空白ページを追加します。

    1. 図9-1に示すように、「ページ・タイプの選択」で、「空白」を選択して「ページの追加」をクリックします。

      図9-1 ページの追加

      図9-1の説明が続きます。
      「図9-1 ページの追加」の説明

      ページ上部の「アプリケーションの作成」リストに、新しいページが表示されます。

    2. 次へ」をクリックします。

  6. 「タブ」で、デフォルトの「1レベルのタブ」を受け入れて「次へ」をクリックします。

  7. 「別のアプリケーションから共有コンポーネントのコピー」で、デフォルトの「いいえ」を受け入れて「次へ」をクリックします。

  8. 「属性」で、「認証スキーム」、「言語」、「ユーザー言語プリファレンスの派生元」にデフォルトを受け入れて、「次へ」をクリックします。

  9. 「ユーザー・インタフェース」で、「テーマ2」を選択して「次へ」をクリックします。

  10. 選択内容を確認して、「作成」をクリックします。

    「アプリケーション」ホームページが表示されます。

アップロード・フォームの作成

アプリケーションを作成した後、次のステップでは、ドキュメントをアップロードするフォームを作成します。次の演習では、HTMLリージョンに、ファイルのアップロード・アイテムとボタンが含まれるフォームを作成します。ボタンによって、ページが送信され、ユーザーが同じページに戻されます。

この項の内容は次のとおりです。

HTMLリージョンの作成

最初に、フォームを保持するコンテナを作成する必要があります。アプリケーション・ビルダーでは、このコンテナはリージョンと呼ばれます。

HTMLリージョンを作成するには、次のステップを実行します。

  1. ページ1」アイコンをクリックします。

    ページ定義が表示されます。

  2. 図9-2に示すように、「リージョン」で、「作成」アイコンをクリックします。

    図9-2 「作成」アイコン

    図9-2の説明が続きます。
    「図9-2 「作成」アイコン」の説明

  3. 「リージョン」で、次のステップを実行します。

    1. 「このページに追加するリージョン・タイプを指定」で、デフォルトの「HTML」を受け入れ、「次へ」をクリックします。

    2. 「作成するHTMLリージョン・コンテナのタイプの選択」で、デフォルトの「HTML」を受け入れ、「次へ」をクリックします。

  4. 「表示属性」で、次のステップを実行します。

    1. 「タイトル」に、Submit Fileと入力します。

    2. 残りのデフォルトを受け入れて「次へ」をクリックします。

  5. 残りのデフォルトを受け入れて「リージョンを作成」をクリックします。

    ページ定義が表示されます。

アップロード・アイテムの作成

次に、テキスト・フィールドまたはアイテムを作成する必要があります。アプリケーション・ビルダーでは、アイテムは、HTMLフォームの一部です。アイテムは、テキスト・フィールド、テキスト領域、パスワード、選択リスト、チェック・ボックスなどを示します。次の演習では、ファイル参照アイテムを作成します。ファイル参照アイテムを作成すると、アップロードしたファイルはwwv_flow_file_objects$と呼ばれる表に格納されます。

ファイルのアップロード・アイテムを作成するには、次のステップを実行します。

  1. ページ1のページ定義の「アイテム」で、「作成」アイコンをクリックします。

  2. 「アイテム・タイプ」で、「ファイル参照」を選択して「次へ」をクリックします。

  3. 「表示位置および名前」で、次のステップを実行します。

    1. 「アイテム名」に、P1_FILE_NAMEと入力します。

    2. 「順序」で、デフォルトを受け入れます。

    3. 「リージョン」で、「Submit File」を選択します。

    4. 次へ」をクリックします。

  4. 残りのデフォルトを受け入れて「次へ」をクリックします。

  5. アイテムの作成」をクリックします。

    ページ定義が表示されます。

ボタンの作成

次に、ファイルを送信するボタンを作成する必要があります。

ボタンを作成するには、次のステップを実行します。

  1. 「ボタン」で、「作成」アイコンをクリックします。

  2. 「ボタン・リージョン」で、「ファイルの送信 (1) 1」を選択して「次へ」をクリックします。

  3. 「ボタン位置」で、「リージョン位置にボタンを作成」を選択して「次へ」をクリックします。

  4. 「ボタン属性」で、次のステップを実行します。

    1. 「ボタン名」に、送信と入力します。

    2. 残りのデフォルトを受け入れます。

    3. 次へ」をクリックします。

  5. 「ボタン・テンプレート」で、デフォルトを受け入れて「次へ」をクリックします。

  6. 「表示プロパティ」で、デフォルトを受け入れて「次へ」をクリックします。

  7. 「ブランチ」で、次のステップを実行します。

    1. 「ページにブランチ」で、「ページ1」を選択します。

      このように選択すると、送信によって別のページにナビゲートされるのではなく、このページ自体がコールされます。

    2. ボタンの作成」をクリックします。

  8. 図9-3に示すように、「ページの実行」アイコンをクリックしてページを実行します。

    図9-3 「ページの実行」アイコン

    図9-3の説明が続きます。
    「図9-3「ページの実行」アイコン」の説明

  9. ユーザー名およびパスワードを入力するように要求されたら、作業領域のユーザー名およびパスワードを入力して、「ログイン」をクリックします。詳細は、「アプリケーション認証の概要」を参照してください。

ページを実行すると、図9-4のように表示されます。

図9-4 ファイルの送信フォーム

図9-4の説明が続きます。
「図9-4 ファイルの送信フォーム」の説明

ダウンロード・リンクを持つレポートの作成

ドキュメントをアップロードするフォームを作成したら、次のステップでは、アップロードされたドキュメントへのリンクを含むドキュメント表のレポートを作成します。ファイル参照アイテムを使用すると、アップロードしたファイルはwwv_flow_file_objects$と呼ばれる表に格納されます。すべての作業領域は、APEX_APPLICATION_FILESと呼ばれるビューを介した、この表へのアクセス権を所有しています。

この項の内容は次のとおりです。

APEX_APPLICATION_FILESのレポートの作成

APEX_APPLICATION_FILESのレポートを作成するには、次のステップを実行します。

  1. ページ下部の「開発者」ツールバーの「ページの編集1」をクリックします。

    ページ定義が表示されます。

  2. 「リージョン」で、「作成」アイコンをクリックします。

  3. 「リージョン」で、「レポート」を選択して「次へ」をクリックします。

  4. 「レポート実装」で、「SQLレポート」を選択して「次へ」をクリックします。

  5. 「表示属性」で、次のステップを実行します。

    1. 「タイトル」に、Uploaded Filesと入力します。

    2. 残りのデフォルトを受け入れて「次へ」をクリックします。

  6. 「ソース」で、次のSQL問合せを入力します。

    SELECT id,name FROM APEX_APPLICATION_FILES
    
    
  7. リージョンの作成」をクリックします。

  8. ページを実行します。

図9-5のようなレポートが表示されます。どのファイルをアップロードしたかによって、表示される内容が多少異なる場合があります。

図9-5 「Uploaded Files」レポート

図9-5の説明が続きます。
「図9-5 「Uploaded Files」レポート」の説明

ドキュメントをダウンロードするリンクの追加

次に、各ドキュメントをダウンロードするリンクを設定する必要があります。

ドキュメントをダウンロードするリンクをレポートに設定するには、次のステップを実行します。

  1. 「開発者」ツールバーで「ページの編集1」をクリックします。

  2. 図9-6に示すように、「リージョン」で、「Uploaded Files」の横にある「レポート」をクリックします。

    図9-6 「レポート」リンク

    図9-6の説明が続きます。
    「図9-6 「レポート」リンク」の説明

    「レポート属性」ページが表示されます。「列属性」を編集してID列にリンクを追加できます。

  3. 「列属性」で、ID行内の「編集」アイコンをクリックします。

  4. 「列リンク」までスクロールします。

  5. 「列リンク」で、次のステップを実行します。

    1. 「リンク・テキスト」で、「#ID#」を選択します。

    2. 「ターゲット」で、「URL」を選択します。

    3. 「URL」フィールドに、次のように入力します。

      p?n=#ID#
      
      

      #ID#は、列のエイリアスがIDである列に含まれる値を渡します。

  6. ページ上部の「変更の適用」をクリックします。

  7. ページを実行します。

    ページを実行すると、図9-7のように表示されます。

    図9-7 ダウンロード・リンク付きの「Uploaded Files」レポート

    図9-7の説明が続きます。
    「図9-7 ダウンロード・リンク付きの「Uploaded Files」レポート」の説明

  8. リンクをテストするには、IDをクリックします。

    「ファイルのダウンロード」ダイアログ・ボックスが表示されます。

  9. 「開発者」ツールバーの「ページの編集1」をクリックして、ページ定義に戻ります。

ドキュメントに関する追加属性の格納

次に、アップロードするドキュメントに関する追加情報を格納する別の表を作成します。この例では、次のステップを実行します。

この項の内容は次のとおりです。

ドキュメント属性を格納する表の作成

最初に、「SQLコマンド」に表を作成します。


参照:

『Oracle Database Application Expressユーザーズ・ガイド』の「SQLコマンドの使用」

アップロード済ファイルに関する追加情報を格納する表を作成するには、次のステップを実行します。

  1. 「SQLコマンド」に移動します。

    1. 図9-8に示すように、ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。

      図9-8 ブレッドクラム・メニュー

      図9-8の説明が続きます。
      「図9-8 ブレッドクラム・メニュー」の説明

      「作業領域」ホームページが表示されます。

    2. 「作業領域」ホームページで「SQLワークショップ」をクリックして、「SQLコマンド」をクリックします。

      「SQLコマンド」ページが表示されます。

  2. 上部のセクションに、次のように入力します。

    CREATE TABLE oehr_file_subject
       (name     VARCHAR2(4000) primary key,
        subject  VARCHAR2(4000));
    
    
  3. 実行」をクリックします。

    Table created」というメッセージが「結果」セクションに表示されます。

  4. ホーム」ブレッドクラム・リンクをクリックします。

    「作業領域」ホームページが表示されます。

ドキュメントの件名を取得するアイテムの作成

ドキュメントの件名を取得するアイテムを作成するには、次のステップを実行します。

  1. ページ1のページ定義に移動します。

    1. 「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。

    2. 「アプリケーション・ビルダー」ホームページで、「Download App」をクリックします。

    3. 「アプリケーション」ホームページで、「ページ1」アイコンをクリックします。

    ページ1のページ定義が表示されます。

  2. 「アイテム」で、「作成」アイコンをクリックします。

  3. 「アイテム・タイプ」で、「テキスト」を選択して「次へ」をクリックします。

  4. 「テキスト制御の表示タイプ」で、「テキスト・フィールド」を選択して「次へ」をクリックします。

  5. 「表示位置および名前」で、次のステップを実行します。

    1. 「アイテム名」に、P1_SUBJECTと入力します。

    2. 「順序」で、デフォルトを受け入れます。

    3. 「リージョン」で、「Uploaded Files」を選択します。

    4. 次へ」をクリックします。

  6. 「アイテム属性」で、次のステップを実行します。

    1. 「ラベル」フィールドに、Subjectと入力します。

    2. 残りのデフォルトを受け入れます。

    3. 次へ」をクリックします。

  7. アイテムの作成」をクリックします。

情報を挿入するプロセスの作成

次に、件名情報を新しい表に挿入するプロセスを作成する必要があります。

プロセスを作成するには、次のステップを実行します。

  1. 「ページ・プロセス」の「プロセス」で、「作成」アイコンをクリックします。

  2. 「プロセス・タイプ」で、「PL/SQL」を選択して「次へ」をクリックします。

  3. 「プロセス属性」で、次のステップを実行します。

    1. 「名前」に、Insert file descriptionと入力します。

    2. 「順序」で、デフォルトを受け入れます。

    3. 「ポイント」で、「送信時 - 計算および検証の後」を選択します。

    4. 次へ」をクリックします。

  4. 「PL/SQLページ・プロセスの入力」に、次のように入力します。

    INSERT INTO oehr_file_subject(name, subject) VALUES(:P1_FILE_NAME,:P1_SUBJECT);
    
    
  5. 次へ」をクリックします。

  6. 「メッセージ」で、次のステップを実行します。

    1. 「成功メッセージ」に、次のように入力します。

      Subject inserted
      
      
    2. 「失敗メッセージ」に、次のように入力します。

      Error inserting subject
      
      
    3. 次へ」をクリックします。

  7. 「プロセス条件」で、次のステップを実行します。

    1. 「対象ボタン」で、「送信」を選択します。

    2. 残りのデフォルトを受け入れて「プロセスの作成」をクリックします。

レポート・リージョン内の追加属性の表示

最後に、SQLレポート・リージョンを変更して追加属性表に結合する必要があります。これを行うには、「リージョン定義」ページで「リージョン・ソース」属性を編集します。

「リージョン・ソース」を編集するには、次のステップを実行します。

  1. 「リージョン」で、「Uploaded Files」をクリックします。

    リージョン定義が表示されます。

  2. 「ソース」までスクロールします。

  3. リージョン・ソースを次と置き換えます。

    SELECT w.id,w.name,s.subject
    FROM APEX_APPLICATION_FILES w,oehr_file_subject s
    WHERE w.name = s.name
    
    
  4. 変更の適用」をクリックします。

  5. ページを実行します。

  6. 参照」をクリックしてアップロードするファイルを検索し、「送信」をクリックします。

    図9-9に示すように、「Uploaded Files」レポートには、Subject列が表示されるようになります。

    図9-9 Subject列が表示されている「Uploaded Files」レポート

    図9-9の説明が続きます。
    「図9-9 Subject列が表示されている「Uploaded Files」レポート」の説明

  7. 「開発者」ツールバーの「ページの編集1」をクリックして、ページ定義に戻ります。

カスタム表へのドキュメントの格納

アップロード済ドキュメントを自分のスキーマが所有する表に格納する場合があります。たとえば、アップロード済ドキュメントにOracle Text索引を作成する場合、ドキュメントはカスタム表に格納する必要があります。

カスタム表にドキュメントを格納するには、次のステップを実行します。

BLOB列をoehr_file_subject表に追加するには、次のステップを実行します。

  1. 「SQLコマンド」に移動します。

    1. ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。

      「作業領域」ホームページが表示されます。

    2. 「作業領域」ホームページで「SQLワークショップ」をクリックして、「SQLコマンド」をクリックします。

      「SQLコマンド」ページが表示されます。

  2. 上部のセクションに、次のSQL文を入力します。

    ALTER TABLE oehr_file_subject ADD(id number,blob_content BLOB,mime_type varchar2(4000) );
    
    
  3. 実行」をクリックします。

    Table Altered」というメッセージが表示されます。

  4. ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。

oehr_file_subject表にドキュメントが挿入されるようにプロセスを変更するには、次のステップを実行します。

  1. 「作業領域」ホームページで、「アプリケーション・ビルダー」をクリックします。

  2. Download App」をクリックします。

  3. ページ1」をクリックします。

  4. 「プロセス」で、「Insert file description」リンクをクリックします。

  5. 「ソース」までスクロールします。

  6. 「ソース」で、プロセスを次のコードと置き換えます。

      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;
    
    
  7. 変更の適用」をクリックします。

カスタム表からのドキュメントのダウンロード

ドキュメントがカスタム表に格納されるようになると、ドキュメントをダウンロードする方法を指定する必要があります。これを行うには、プロシージャを作成して、そのプロシージャに対する実行権限を擬似ユーザーAPEX_PUBLIC_USERに付与します。

これを実行するには、次の内容を変更する必要があります。

この項の内容は次のとおりです。

ドキュメントをダウンロードするためのプロシージャの作成

oehr_file_subject表からのドキュメントのダウンロード、およびpublicへの実行権限の付与を行うプロシージャを作成するには、次のステップを実行します。

  1. 「SQLコマンド」に移動します。

    1. ページ上部の「ホーム」ブレッドクラム・リンクをクリックします。

      「作業領域」ホームページが表示されます。

    2. 「作業領域」ホームページで「SQLワークショップ」をクリックして、「SQLコマンド」をクリックします。

      「SQLコマンド」ページが表示されます。

  2. 次の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;
    /
    
    
  3. 実行」をクリックします。

    Procedure Created」というメッセージが表示されます。

    次に、別のSQL文を実行します。

  4. SQLワークショップ」ブレッドクラム・リンクをクリックして、「SQLコマンド」をクリックします。

    「SQLコマンド」ページが表示されます。

  5. 上部のセクションで、既存のSQL文を次のように置き換えます。

    GRANT EXECUTE ON download_my_file TO PUBLIC/
    
    
  6. 実行」をクリックします。

    Statement processed」というメッセージが表示されます。

  7. ページ上部の「ホーム」ブレッドクラム・リンクをクリックして、「作業領域」ホームページに戻ります。

「Uploaded Files」リージョンの編集

SQLレポート・リージョンを変更して、APEX_APPLICATION_FILESビューと結合しないようにするには、次のステップを実行します。

  1. ページ1のページ定義に移動します。

    1. 「作業領域」ホームページで、「アプリケーション・ビルダー」をクリックします。

    2. 「アプリケーション・ビルダー」ホームページで、「Download App」をクリックします。

    3. 「アプリケーション」ホームページで、「ページ1」をクリックします。

  2. 「リージョン」で、「Uploaded Files」をクリックします。

  3. 「ソース」までスクロールします。

  4. リージョン・ソースを次と置き換えます。

    SELECT s.id,s.name,s.subject FROM oehr_file_subject s
    
    
  5. 変更の適用」をクリックします。

    ページ定義が表示されます。

新規プロシージャを使用するためのダウンロード・リンクの変更

ダウンロード・リンクを変更して、新しいダウンロード・プロシージャを使用するには、次のステップを実行します。

  1. 「リージョン」で、「Uploaded Files」の横にある「レポート」をクリックします。

  2. ID行で、「編集」アイコンをクリックします。

  3. 「列リンク」セクションまでスクロールします。

  4. 「URL」フィールドで、既存のURLを次のように置き換えます。

    #OWNER#.download_my_file?p_file=#ID#
    
    

    このURLの内容は、次のとおりです。

    • #OWNER#は、カレント・アプリケーションを解析しているスキーマです。

    • download_my_fileは、作成した新しいプロシージャです。

    • 列IDの値をパラメータp_fileに渡します。

  5. 変更の適用」をクリックします。

    ページ定義が表示されます。

考慮する必要があるセキュリティ上の問題

このチュートリアルで構築するアプリケーションでは、プロシージャ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;