ヘッダーをスキップ
Oracle Database Application Express 2日で開発者ガイド
リリース2.2
B31495-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

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

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

内容は次のとおりです。

アプリケーションの作成

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

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

  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. 「リージョン」で、「HTML」を選択して「次へ」をクリックします。

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

    1. 「タイトル」に、ファイルの送信と入力します。

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

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

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

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

次に、テキスト・フィールドまたはアイテムを作成する必要があります。 アプリケーション・ビルダーでは、アイテムは、HTMLフォームの一部です。アイテムは、テキスト・フィールド、テキスト領域、パスワード、選択リスト、チェック・ボックスなどを示します。

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

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

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

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

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

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

    3. 「リージョン」で、「ファイルの送信」を選択します。

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

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

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

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

ボタンの作成

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

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

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

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

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

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

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

    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. 「リンク・テキスト」フィールドに、次のように入力します。

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

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

      p?n=#ID#
      
      

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 情報を取得するためのアイテムをアップロード・フォームに追加します。

  • ファイル名とともに、この情報を挿入するプロセスを追加します。

  • アップロード済ファイルのSQLレポートを変更して、追加情報を含む表に結合します。

このセクションの内容は次のとおりです。

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

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


参照:

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

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

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

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

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

    CREATE TABLE file_subjects(name  VARCHAR2(4000), 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と入力します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    最初に、「Uploaded Files」レポートに3つすべての列が表示されない場合は、ファイルをアップロードし、「Submit」ボタンをクリックしてみてください。

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

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

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

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

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

  • ドキュメントを格納するBLOB型の列を追加します。

  • プロセスを変更して、カスタム表にドキュメントを挿入します。

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

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

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

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

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

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

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

プロセスを変更して、file_subjects表にドキュメントを挿入するには、次のステップを実行します。

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

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

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

  4. 「プロセス」で、「挿入」リンクをクリックします。

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

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

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

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

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

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

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

  • APEX_APPLICATION_FILESビューに結合されなくなったSQLレポート・リージョン

  • SQLレポートのID列に指定されたURL(以前のプロシージャを実行するかわりに、新しいプロシージャを実行するため)

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

  1. 「作業領域」ホームページで「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 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;
    /
    
    
  3. 実行」をクリックします。

    Procedure Created」というメッセージが表示されます。 別のSQL文を実行します。

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

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

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

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

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

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

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 file_subjects 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;