目次＞ 第3章 サンプルアプリケーション構築 > 3.4 通信処理機能 > 3.4.3 ファイルダウンロード通信

# 3.4.3 ファイルダウンロード通信

## 1 概要

本節ではClient Frameworkが提供するイベント処理機能及びファイルダウンロード機能を用いて、クライアント・サーバ間でファイルダウンロードを行う方法を説明する。
ファイルダウンロード処理を行う場合は、画面からClient Frameworkが提供するファイルダウンロード用のビジネスロジックを実行する。ファイルダウンロード用のビジネスロジックは、ビジネスロジック入力データセットをXML電文に変換してサーバに送信し、サーバからファイルをダウンロードする。詳細は、機能説明書『FB-02 データセット変換機能』、『CM-04 ビジネスロジック生成機能』、『FC-03 ファイルダウンロード機能』を参照のこと。

### 1.1 動作イメージ

図1.1-1 動作イメージ

- 対象画面
  - ファイルダウンロード画面(FileDownloadForm.cs)
- 処理概要

1. (クライアント)ダウンロードするファイルを選択し、ダウンロードボタンを押下して、イベント処理機能を実行する。
2. (クライアント)イベント処理機能は、画面データセットにバインドされたファイル名をビジネスロジック入力データセットにコピーし、ファイルダウンロード用ビジネスロジックを実行する。
3. (クライアント)ファイルダウンロード用ビジネスロジックは、ビジネスロジック入力データセットの値をサーバへ送信する。
4. (サーバ)ダウンロードビジネスロジックがファイル名を受け取る。
5. (サーバ)ローカル領域のファイルをクライアントへ送信する。
6. (クライアント)ファイルダウンロード用ビジネスロジックは、受信したダウンロードファイルを指定した場所に保存する。
7. (クライアント)ダウンロードの成功可否をユーザへ通知する。

### 1.2 クライアントが送信するリクエストの仕様

リクエストヘッダにはリクエスト名"download"を設定する。リクエスト名によって実行されるビジネスロジックが決定される。リクエストボディには、ダウンロードを行うファイルの名前をXMLとして設定する。

- リクエストヘッダ

表1.2-1 リクエストヘッダ内容

Key値 | Value値 | 内容
RequestName | download | サーバで実行するビジネスロジックを特定するためのリクエスト名。

- リクエストボディ

      <FileTable xmlns="http://com.example.dotnet/FileDownloadDs.xsd">
        <FileTable>
          <FileName>てらそるな.txt</FileName>
        </FileTable>
      </FileTable>

### 1.3 クラアントが受信するレスポンスの仕様

レスポンスボディにはダウンロードするファイルのバイナリデータが設定される。

## 2 作業手順

- 作成イメージ

図2-1 作業イメージ

1. 業務画面の確認
2. 画面データセットの作成
3. 画面項目と画面データセットのバインド
4. ビジネスロジック設定ファイルの設定
5. EventControllerコンポーネントインスタンスの追加
6. EventControllerコンポーネントの設定
7. EventControllerコンポーネントの実行

### 2.1 業務画面の確認

ファイルダウンロード画面(FileDownloadForm.cs)がVisual Studioのデザイナに表示されることを確認する。また、ファイルダウンロード画面は拡張フォーム(FormBase)を継承していることを確認する。

図2.1-1 ファイルダウンロード画面の確認

FileDownloadForm.cs

    namespace TutorialClient
    {
    /// <summary>
    /// ファイルダウンロードを行う画面です。
    /// </summary>
    /// <remarks>
    /// サーバからテキスト形式のファイル、CSV形式のファイル、PNG形式のファイル
    /// を一つ選択してダウンロードします。
    /// </remarks>
    public partial class FileDownloadForm : FormBase
    {

       /// <summary>
       /// <see cref="CalcForm"/>クラスの新しいインスタンスを初期化します。
       /// </summary>
       /// <remarks>
       /// デフォルトコンストラクタです。
       /// </remarks>
       public FileDownloadForm()
       {
          InitializeComponent();
       }
    }

### 2.2 画面データセットの作成

#### 2.2.1 画面データセットの新規作成

ファイルダウンロード画面の画面データセット(FileDownloadDs.xsd)を作成する。 第3章3.1画面作成時のポイントを参照のこと。

表2.2.1-1 データセットの格納場所とファイル名

ファイル格納場所 | ファイル名
\TutorialClientBlank\ViewData | FileDownloadDs.xsd

表2.2.1-2 作成するデータセットの名前空間

Namespace | http://com.example.dotnet/FileDownloadDs.xsd

表2.2.1-3 作成するデータセットのテーブル、カラム、データ型の一覧

Table名 | Column名 | DataType(型) | DefaultValue
FileTable |  |  |
| FileName | System.String | <DBNull>
| RadioTextFile | System.Boolean | False
| RadioCsvFile | System.Boolean | False
| RadioPngFile | System.Boolean | False

図2.2.1-1 画面データセットの完成形

#### 2.2.2 画面データセットがツールボックスに表示されることの確認

画面データセットの作成が完了したら保存し、ビルドする。ビルド後に作成したデータセットがツールボックスに表示され、コンポーネントとして利用できるようになっていることを確認する。

図2.2.2-1 データセットがコンポーネントに追加されている例

### 2.3 画面項目と画面データセットのバインド

#### 2.3.1 画面データセットのインスタンスの追加

ツールボックスからデータセット「FileDownloadDs」のインスタンスをファイルダウンロード画面へ追加する。追加したデータセットのインスタンスのNameプロパティを「fileDownloadDs1」から「fileDownloadDs」に変更する。

図2.3.1-1 画面データセットの追加

#### 2.3.2 画面項目と画面データセットのバインド

ファイルダウンロード画面の画面項目と画面データセットをバインドする。

表2.3.2-1 画面項目と画面データセットの対応一覧

画面項目名 | コントロール種別 | DataTable名 | Column(列)名
|  | FileTable |
テキストファイル | ラジオボタン |  | RadioTextFile
CSVファイル | ラジオボタン |  | RadioCsvFile
画像ファイル | ラジオボタン |  | RadioPngFile

ファイルダウンロード画面の画面項目と画面データセットをバインドする。 ラジオボタンのチェックボックスにデータバインドする際は、DataBindingsプロパティのcheckedにバインドする。

図2.3.2-1 テキストファイル(ラジオボタン)のバインド例

#### 2.3..3 画面データセットの初期化

ファイルダウンロード画面クラスのLoadイベントに、画面データセットの行を追加するロジックを実装する。

FileDownloadForm.cs

    /// <summary>
    /// フォームロード時に実行されるイベントハンドラです。
    /// </summary>
    /// <remarks>
    /// <para>画面データセットを初期化します。</para>
    /// </remarks>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
    private void FileDownloadForm_Load(object sender, EventArgs e)
    {
       fileDownloadDs.FileTable.AddFileTableRow(fileDownloadDs.FileTable.NewFileTableRow());
    }

### 2.3.4 ビジネスロジック設定ファイルの設定

ビジネスロジック設定ファイル（BLogicConfiguration.config）に、ファイルダウンロードを実行するビジネスロジックを定義する。 ビジネスロジック名(name属性)には"downloadBLogic"を、type属性にはClient Frameworkが提供するファイルダウンロード用ビジネスロジッククラス（BinaryFileDownloadBLogic）のアセンブリ修飾名を記述する。ビジネスロジック設定ファイルの設定に関する詳細は『CM-04 ビジネスロジック生成機能』を参照のこと。

BLogicConfiguration.config

    <?xml version="1.0" encoding="utf-8"?>
    <!-- ビジネスロジック設定ファイル -->
    <blogicConfiguration xmlns="http://www.terasoluna.jp/schema/BLogicSchema.xsd">

      <!-- ユーザー定義ビジネスロジック -->
      <blogic name="logonBLogic" type="TutorialClient.BLogic.LogonBLogic, TutorialClient" />

      <!-- XML通信を行うビジネスロジック -->
      <blogic name="communicateBLogic" type="TERASOLUNA.Fw.Client.BLogic.DataSetXmlCommunicateBLogic`1, TERASOLUNA.Fw.Client" />

      <!-- ファイルアップロードを行うビジネスロジック -->
      <blogic name="multipartUploadBLogic" type="TERASOLUNA.Fw.Client.BLogic.MultipartUploadBLogic`1, TERASOLUNA.Fw.Client" />

     <!-- ファイルダウンロードを行うビジネスロジック -->
      <blogic name="downloadBLogic" type="TERASOLUNA.Fw.Client.BLogic.BinaryFileDownloadBLogic, TERASOLUNA.Fw.Client" />

    </blogicConfiguration>

### 2.3.5 EventControllerコンポーネントインスタンスの追加

ツールボックスからEventControllerコンポーネントを追加する。

図2.3.5-1 EventControllerコンポーネント

### 2.3.6 EventControllerコンポーネントのプロパティの設定

ファイルダウンロード画面クラスに追加したEventControllerコンポーネントのプロパティを設定にする。 BLogicNameプロパティに 4. ビジネスロジック設定ファイルの設定 で設定した"downloadBLogic"を指定することで、ファイルダウンロードを行うことができる。
本節では、2つのEventControllerのイベントを追加する。ExecuteProgressChangedでは、ダウンロードしたファイルを保存するパスを指定し、Preprocessedでは選択されたラジオボタンに対応するファイル名を画面データセットに設定する。

図2.3.6-1 downloadEventのプロパティの設定

表2.3.6-1 downloadEventのプロパティ一覧と説明

プロパティ名 | 設定値 | 備考
Name | downloadEvent | インスタンスの名前。
BLogicName | downloadBLogic | 4. ビジネスロジック設定ファイルの設定で設定したダウンロード用ビジネスロジックのビジネスロジック名を設定する。
RequestName | download | サーバで実行するビジネスロジックを特定するためのリクエスト名。
ErrorHandler | FileDownloadForm | IErrorHandler実装クラスのインスタンス。
ViewData | filedownloadDs | 画面データセットのインスタンス。

図2.3.6-2downloadEventのイベントの設定

プロパティ名 | 設定値 | 備考
ExecuteProgressChanged | downloadevent_ExecuteProgressChanged | ダウンロード処理の進行状況のイベントハンドラ。
Preprocessed | downloadEvent_Preprocessed | ダウンロード処理の前処理のイベントハンドラ。

### 2.3.7 EventControllerコンポーネントの実行

ファイルダウンロード画面(FileDownloadForm.cs)に配置されたダウンロードボタンのクリックイベントハンドラを実装する。また、ファイダウンロード画面クラスにダウンロード処理の前処理イベントハンドラ、ダウンロード処理の進行状況イベントハンドラ、も実装する必要がある。

#### 2.3.7.1 ダウンロード処理の前処理イベントハンドラ

ダウンロード処理の前処理イベントハンドラで、ダウンロードするファイルを決定するロジックを実装する。

FileDownloadForm.cs

    /// <summary>
    /// ダウンロード処理の前処理イベントハンドラです。
    /// </summary>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している <see cref="PreprocessedEventArgs"/>。</param>
    private void downloadEvent_Preprocessed(object sender, PreprocessedEventArgs e)
    {
       FileDownloadDs blogicParamData = e.BLogicParamData as FileDownloadDs;
       blogicParamData.FileTable.AddFileTableRow(blogicParamData.FileTable.NewFileTableRow());

       //ダウンロードファイルの選択
       if (fileDownloadDs.FileTable[0].RadioTextFile)
       {
          blogicParamData.FileTable[0].FileName = "てらそるな.txt";
       }
       else if (fileDownloadDs.FileTable[0].RadioCsvFile)
       {
          blogicParamData.FileTable[0].FileName = "てらそるな.csv";
       }
       else if (fileDownloadDs.FileTable[0].RadioPngFile)
       {
          blogicParamData.FileTable[0].FileName = "てらそるな.png";
       }
       else
       {
          MessageBox.Show(Properties.Resources.DOWNLOAD_SELECT, Properties.Resources.DOWNLOAD_FORM_FAILURE);
       }
    }

ファイルダウンロード画面で選択されたラジオボタンに対応するファイル名を設定する。下記にラジオボタンに対応するファイル名を示す。

表2.3.7.1-1 ラジオボタンとファイル名の対応一覧

画面項目 | データセットのカラム名 | ファイル名
テキストファイル | RadioTextFile | てらそるな.txt
CSVファイル | RadioCsvFile | てらそるな.csv
画像ファイル | RadioPngFile | てらそるな.png

ファイルダウンロード画面で何も選択されずにダウンロードボタンを押下した場合は、エラーメッセージを設定する。

#### 3.4.3.2.3.7.2 ダウンロード処理の進行状況イベントハンドラ

ダウンロード処理の進行状況イベントハンドラには、ファイルダウンロードを行う通信クラスにダウンロードするファイルパスを通知するロジックを実装する。 ビジネスロジックに通知したファイルパスに、サーバからダウンロードしたファイルが保存される。

FileDownloadForm.cs

    /// <summary>
    /// ダウンロード処理の進行状況イベントハンドラです。
    /// </summary>
    /// <remarks>
    /// <para>e.Itemsに、ダウンロード通知キーが含まれている場合、ダウンロードパスの設定を行います。</para>
    /// </remarks>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している <see cref="ExecuteProgressChangedEventArgs"/>。</param>
    private void Downloadevent_ExecuteProgressChanged(object sender, ExecuteProgressChangedEventArgs e)
    {
        // サーバから正常にデータを受信した場合（ダウンロード準備完了）
        if (e.Items.Contains(BinaryFileDownloadBLogic.DOWNLOAD_READY))
        {
            // サーバから受信したファイル名の取得
            string contentFileName = e.Items[BinaryFileDownloadBLogic.CONTENT_FILENAME] as string;

            // ファイル保存ダイアログを利用したダウンロードファイルパスの決定
            saveFileDialog.InitialDirectory = Properties.Resources.DOWNLOAD_PATH;
            saveFileDialog.FileName = contentFileName;
            if (DialogResult.OK == saveFileDialog.ShowDialog())
            {
                // ダウンロードファイルパスの設定
                e.Items.Add(BinaryFileDownloadBLogic.DOWNLOAD_FILEPATH, saveFileDialog.FileName);
            }
            else
            {
                if (downloadEvent.Items.Keys.Contains(BinaryFileDownloadBLogic.DOWNLOAD_FILEPATH))
                {
                    downloadEvent.Items.Remove(BinaryFileDownloadBLogic.DOWNLOAD_FILEPATH);
                }
            }
        }
    }

ダウンロードが正常に完了した場合、ファイル保存ダイアログボックスを表示してユーザにダウンロードしたファイルの保存パスを指定させる。
ユーザが指定した保存パスを通信クラスに通知するため、引数ExecuteProgressChangedEventArgsクラスのItemsプロパティの「BinaryFileDownloadBLogic.DOWNLOAD_FILEPATH」キーに保存パスを追加する。
実装内容の詳細は、機能説明書『FC-03 ファイルダウンロード機能』を参照のこと。

#### 2.3.7.3 ダウンロードボタンのクリックイベントハンドラ

ダウンロードボタンのクリックイベントハンドラには、 4. ビジネスロジック設定ファイルの設定 でプロパティ設定を行ったEventControllerを実行するロジックを実装する。

FileDownloadForm.cs

    /// <summary>
    /// ダウンロードボタン押下時に実行されるイベントハンドラです。
    /// </summary>
    /// <remarks>ファイルダウンロード処理を実行します。</remarks>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
    private void fileDownloadButton_Click(object sender, EventArgs e)
    {
       //ダウンロード処理の実行
       ExecutionResult result = downloadEvent.Execute();

       //サーバとの通信成功
       if (result.Success)
       {
          // ダウンロードが成功したことを画面に表示する
          if (downloadEvent.Items.Keys.Contains(BinaryFileDownloadBLogic.DOWNLOAD_FILEPATH))
          {
             //サーバビジネスロジック正常終了
             string message = string.Format(Properties.Resources.DOWNLOAD_SUCCESS,downloadEvent.Items[BinaryFileDownloadBLogic.DOWNLOAD_FILEPATH].ToString());
             MessageBox.Show(message, Properties.Resources.DOWNLOAD_FORM_SUCCESS);
          }
       }
       else
       {
           //サーバビジネスロジック業務エラー
           MessageBox.Show(Properties.Resources.DOWNLOAD_FAILURE, Properties.Resources.DOWNLOAD_FORM_FAILURE);
       }
    }

EventControllerのExecuteメソッドを実行して、サーバにダウンロードするファイル名を送信する。サーバとの通信が成功した場合、Executeメソッドの戻り値ExecutionResultにSUCCESSが格納される。通信が成功し、サーバからダウンロードしたファイルの保存が正常に行われた場合は、メッセージボックスに成功メッセージを表示する。ダウンロードに失敗した場合は、エラーメッセージを表示する。

## 3 動作確認

1. 通信先URLの確認を行う。

通信先URLがアプリケーション構成ファイル(App.config)に指定されていることを確認する。アプリケーション構成ファイルのadd要素のkey属性に「BaseUrl」、value属性に「http://localhost/TutorialServerRich/Request.aspx」と設定されていることを確認する。

App.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>

    　・・・ 省略 ・・・

      <appSettings>
        <!-- 通信先URL設定 -->
        <add key="BaseUrl" value="http://localhost/TutorialServerRich/Request.aspx"/>
      </appSettings>

    </configuration>

2. クライアントアプリケーションを起動する(デバッグ⇒デバッグなしで開始)。
3. ユーザID "tera"、パスワード "soluna" と入力し、ログオンボタンを押下する。

図3-1 ログオン画面⇒メニュー画面

3. ファイルダウンロード画面を押下する。

図3-2 メニュー画面⇒ファイルダウンロード画面

4. テキストファイルを選択し、ダウンロードボタンを押下する。

図3-3 ファイルダウンロード画面⇒ファイル選択画面

5. ダウンロードを行う場所(C:\)を選択し、ファイル名"てらそるな.txt"として保存ボタンを押下する。

図3-4 ファイル選択画面⇒ダウンロード成功画面

6. ダウンロード成功画面が表示され、ファイル(C:\てらそるな.txt)が存在することを確認する。

次節：3.5 入力値検証