目次 > 第3章 サンプルアプリケーション構築 > 3.3 ファイルダウンロード通信

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

## 1 概要

本節では、Server Frameworkが提供するファイルダウンロード機能を用いて、クライアント・サーバ間でファイルダウンロードを行う方法を説明する。 ファイルダウンロード機能は、クライアントから送信されたXML電文を受信してビジネスロジックの入力データセットに変換する処理、ビジネスロジック実行処理、ビジネスロジックの結果クラスに格納されたファイル情報をもとにダウンロードファイルをクライアントに返却する処理を順番に実行する。ビジネスロジックのインスタンスは Server Frameworkが提供するビジネスロジック生成機能を用いて生成する。詳細は、機能説明書『FB-03 ファイルダウンロード機能』『CM-04 ビジネスロジック生成機能』を参照のこと。
業務開発者はビジネスロジックのコーディングのみを行うだけでよく、バイナリファイル送信ロジックやXML変換ロジックを記述する必要はない。

### 1.1 動作イメージ

図1.1-1 動作イメージ

- 対象画面
  - ファイルダウンロード画面
- 処理概要
  1. (クライアント)サーバへダウンロードを行うファイル名を送信する。
  2. (サーバ)受信したファイル名から、クライアントへ送信するファイルのデータを取得する。
  3. (サーバ)取得したデータをバイナリ形式でクライアントへ送信する。
  4. (クライアント)サーバから送信されたファイルを保存する。

#### 1.1.1 サーバが受信するリクエストの仕様

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

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

Key値 | Value値 | 内容
RequestName | download | サーバで実行するビジネスロジックを特定するためのリクエスト名。サーバ側のビジネスロジック設定ファイルに定義するビジネスロジック名と対応する。

- リクエストボディ

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

#### 1.1.2 サーバが送信するレスポンスの仕様

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

## 2 作業手順

- 作成イメージ

図2-1 作業イメージ

1. ビジネスロジック入力データセットの作成
2. ビジネスロジックの作成
3. ビジネスロジック設定ファイルの定義

### 2.1 ビジネスロジック入力データセットの作成

クライアントから受信するリクエスト情報(XML電文)の内容を取得するためのビジネスロジック入力データセットを作成する。クライアントへ送信するレスポンス情報はバイナリデータであるため、XML電文に変換するためのビジネスロジック出力データセットを作成する必要はない。XMLとデータセットの変換方法は4.3 XMLとデータセットの変換方法を参照のこと。

図2.1-1 FileDownloadDs.xsdの実装例

表2.1-1 FileDownloadDs.xsdの型

Table名 | Column名 | 型
FileTable |  |
| FileName | System.String

表2.1-2 FileDownloadDs.xsdのプロパティ設定一覧

プロパティ名 | 設定値 | 内容
Namespace | http://com.example.dotnet/FileDownloadDs.xsd | ファイルダウンロード画面の画面データセットの名前空間。

### 2.2 ビジネスロジックの作成

クライアントへファイルを送信する設定を行うビジネスロジックを作成する。ファイルダウンロードを行うビジネスロジックは、IBLogicインターフェイスを実装する必要がある。

#### 2.2.1 ビジネスロジックの新規作成

ビジネスロジック(DownloadBLogic.cs)を新規作成する。

図2.2.1-1 ビジネスロジックのフォルダ構成図

表2.2.1-1 ファイルダウンロードビジネスロジック

アセンブリ名 | 名前空間名 | クラス名
TutorialServerRich | TutorialServerRich.BLogic | DownloadBLogic

#### 2.2.2 ビジネスロジックのクラス属性の指定

ビジネスロジックには、リクエストコントローラやビジネスロジック入力データセットの型を指定する必要がある。
以下に設定する項目を示す。

表2.2.2-1 クラス属性の設定項目

属性 | プロパティ | 設定値 | 説明
ControllerInfo | RequestType | RequestTypeNames .DOWNLOAD | クライアントからの要求に対して、本ビジネスロジックの生成および実行を行うリクエストコントローラを指定する。 ファイルダウンロード処理を行う場合、"DOWNLOAD"を指定する。
ControllerInfo | InputDataSetType | typeof(FileDownloadDs) | クライアントから受信するXML電文を、サーバ側で受け取るためのデータセットの型を指定する。ここで指定したデータセットの型がビジネスロジックの入力データセットの型となる。

DownloadBLogic.cs

    /// <summary>
    /// ダウンロード処理を行うビジネスロジックです。
    /// </summary>
    [ControllerInfo(RequestType = RequestTypeNames.DOWNLOAD, InputDataSetType = typeof(FileDownloadDs))]
    public class DownloadBLogic : IBLogic
    {
      // メンバは後述で説明
    }

#### 2.2.3 ビジネスロジックの実装

IBLogicインターフェイスで定義しているExecuteメソッドに下記のダウンロード処理を実装する。ファイルダウンロードを行う場合、ビジネスロジック結果クラスの型としてFileDownloadBLogicResultクラスを利用し、ダウンロードするファイルを設定すること。

- クライアントからファイル名を送信されているかをチェックする。
  - ファイル名が送信されている場合
    - ファイル名の絶対パスを取得する。
  - ファイル名が送信されていない場合
    - 例外(ArgumentException)をスローする。
- 取得したファイルの絶対パスに、ファイルが存在するかチェックを行う。
  - ファイルが存在する場合
    - Server Frameworkが提供するFileInfoのインスタンス化を行う。
    - 作成したFileInfoインスタンスを入力データとして、Server Frameworkが提供するダウンロード用ビジネスロジッククラスFileDownloadBLogicResultを作成する。
    - 作成したダウンロード用ビジネスロジックインスタンスを返却する。
  - ファイルが存在しない場合
    - 例外(FileNotFoundException)をスローする。

クライアントから受信するファイル名は以下の3つである。

- てらそるな.txt
- てらそるな.csv
- てらそるな.PNG

またクライアントへ送信するファイルは、TutorialServerRichプロジェクトのFileフォルダに用意している。

図2.2.3-1 TutorialServerRich_Fileフォルダ

DownloadBLogic.cs

    using System;
    using System.Configuration;
    using System.Data;
    using System.IO;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using TERASOLUNA.Fw.Common.BLogic;
    using TERASOLUNA.Fw.Web.BLogic;
    using TERASOLUNA.Fw.Web.Controller;
    using TutorialServerRich.Dto;

    namespace TutorialServerRich.BLogic
    {
        /// <summary>
        /// ダウンロード処理を行うビジネスロジックです。
        /// </summary>
        [ControllerInfo(RequestType = RequestTypeNames.DOWNLOAD, InputDataSetType = typeof(FileDownloadDs))]
        public class DownloadBLogic : IBLogic
        {
            /// <summary>
            /// ファイルダウンロードのディレクトリ。
            /// </summary>
            private static readonly string DOWNLOAD_FILE_DIRECTORY = "~/File/{0}";

            /// <summary>
            /// ファイルダウンロードを行うファイルパスを返却する。
            /// </summary>
            /// <param name="param">
            /// ファイルダウンロードを行うファイル名を保持したビジネスロジック入力クラス
            /// </param>
            /// <returns>
            /// ファイルダウンロードを行うファイルパスを保持した<see cref="FileDownloadBLogicResult"/> インスタンス。
            /// </returns>
            public BLogicResult Execute(BLogicParam param)
            {
                // ファイルパスの設定
                FileDownloadDs fileDownloadDs = param.ParamData as FileDownloadDs;
                string filePath = null;

                if (fileDownloadDs.FileTable.Rows.Count != 0 &&
                    !string.IsNullOrEmpty(fileDownloadDs.FileTable[0].FileName))
                {
                    filePath = string.Format(DOWNLOAD_FILE_DIRECTORY, fileDownloadDs.FileTable[0].FileName);
                    filePath = HttpContext.Current.Server.MapPath(filePath);
                }
                else
                {
                    throw new ArgumentException(Properties.Resources.E_NOT_FOUND_BLOGIC_PARAM);
                }

                // ファイル存在チェック
                if (!File.Exists(filePath))
                {
                    string message = string.Format(Properties.Resources.E_NOT_FOUND_DOWNLOADFILE, filePath);
                    throw new FileNotFoundException(message);
                }

                // ダウンロードするファイルのパスをビジネスロジック結果クラスに設定
                FileInfo fileInfo = new FileInfo(filePath);
                FileDownloadBLogicResult blogicResult = new FileDownloadBLogicResult(fileInfo);
                return blogicResult;
            }
        }
    }

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

ビジネスロジック設定ファイル(Config/BLogicConfiguration.config)に、ファイルダウンロードビジネスロジックのビジネスロジック名とアセンブリ修飾名を設定する。本節でクライアントから送信されるリクエスト名は"download"なので、ビジネスロジック名にも"download"を設定すること。（※Server Frameworkのリクエストコントローラ機能は、ビジネスロジック名とリクエスト名が一致するビジネスロジックを実行する）

BLogicConfiguration.config

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

      <!-- 掛け算ビジネスロジック -->
      <blogic name="calc" type="TutorialServerRich.BLogic.CalcBLogic, TutorialServerRich" />

      <!-- ファイルアップロードビジネスロジック -->
      <blogic name="multipartUpload" type="TutorialServerRich.BLogic.MultipartUploadBLogic, TutorialServerRich" />

      <!-- ファイルダウンロードビジネスロジック -->
      <blogic name="download" type="TutorialServerRich.BLogic.DownloadBLogic, TutorialServerRich" />

    </blogicConfiguration>

## 3 動作確認

1. サーバアプリケーションを起動する(TutorialServerRichプロジェクトの発行)。
2. クライアントアプリケーションを起動する(TutorialClient.exeの押下)。
3. ユーザID"tera"、パスワード"soluna"と入力し、ログオンボタンを押下する。

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

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

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

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

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

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

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

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

次節：3.4 入力値検証