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

# 3.2 ファイルアップロード通信

## 1 概要

本節では、Server Frameworkが提供するファイルアップロード機能を用いて、クライアント・サーバ間でファイルアップロードを行う方法を説明する。
ファイルアップロード機能は、マルチパートデータを受信してビジネスロジックのプロパティに設定する処理、ビジネスロジック実行処理、ビジネスロジックの出力データセットをXML電文に変換してクライアントに返却する処理を順番に実行する。ビジネスロジックのインスタンスはServer Frameworkが提供するビジネスロジック生成機能を用いて生成する。詳細は、機能説明書『FB-02 ファイルアップロード機能』、『CM-04 ビジネスロジック生成機能』を参照のこと。
業務開発者はビジネスロジックのコーディングのみを行うだけでよく、マルチパートデータ受信ロジックおよびXML変換ロジックを記述する必要はない。

### 1.1 動作イメージ

図1.1-1 動作イメージ

- 対象画面
  - ファイルアップロード画面
- 処理概要
  1. (クライアント)複数のファイルをマルチパート形式でサーバへ送信する。
  2. (サーバ)受信したマルチパートデータを解析し、サーバに保存する。
  3. (サーバ)ファイルアップロードの受信結果をXML電文としてクライアントへ送信する。
  4. (クライアント)アップロードの成功可否をユーザへ通知する。

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

リクエストヘッダにはリクエスト名"multipartUpload"が設定される。リクエスト名によって実行されるビジネスロジックが決定される。リクエストボディには、アップロードする複数のマルチパートデータが設定される。

- リクエストヘッダ

> 表1.1-1 リクエストヘッダの内容

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

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

マルチパートアップロードデータからファイルアップロード処理を行い、処理結果をXMLとして返却する。

- レスポンスボディ

      <FileUploadDs xmln="http://com.example.dotnet/FileUploadDs.xsd">
        <ReseultTable>
          <Result>true</Result>
        </ResultTable>
      </FileUploadDs>

## 2 作業手順

- 作成イメージ

図2-1 作業イメージ

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

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

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

図2.1-1 FileUploadDs.xsdの実装例

表2.1-1 FileUploadDs.xsdの型

Table名 | Column名 | 型
ResultTable |  |
| Result | System.Boolean

表2.1-2 FileUploadDs.xsdのプロパティ一覧

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

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

マルチパート形式のアップロード処理を行うビジネスロジックを作成する。マルチパート形式のアップロードを行うビジネスロジックは、IUploadBLogicインターフェイスを実装する必要がある。

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

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

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

表2.2.1-1 ファイルアップロードビジネスロジックの内容

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

#### 2.2.2 リクエストコントローラとビジネスロジック入力データセットの定義

ビジネスロジックには、Server Frameworkが実行するリクエストコントローラを判断するために必要となる属性を指定しなければならない。以下に設定する項目を示す。

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

属性 | プロパティ | 設定値 | 説明
ControllerInfo | RequestType | RequestTypeNames .MULTIPART_UPLOAD | マルチパート形式の受信およびXML形式の電文を送信する場合、"RequestTypeNames.MULTIPART_UPLOAD"を指定する。省略不可である。

MultipartUploadBLogic.cs

    /// <summary>
    /// マルチパート形式のアップロードを行う <see cref="IUploadBLogic"/> 実装クラスです。
    /// </summary>
    [ControllerInfo(RequestType = RequestTypeNames.MULTIPART_UPLOAD)]
    public class MultipartUploadBLogic : IUploadBLogic
    {
      // メンバは後述で説明
    }

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

ビジネスロジック(MultipartUploadBLogic.cs)を下記の手順で実装する。

##### 2.2.3.1 MultipartItemListプロパティの実装

IUploadBLogicインターフェイスで定義されているMultipartItemListプロパティを実装する。ファイルアップロード機能が本ビジネスロジック実行前にMultipartItemListにクライアントから受信したマルチパートデータを設定する。

MultipartUploadBLogic.cs

    /// <summary>
    /// 送信されてきたマルチパートデータを保持するフィールド。
    /// </summary>
    private IDictionary<string, IMultipartItem> _multipartItemList = null;

    /// <summary>
    /// 送信されてきたマルチパートデータの設定・取得をします。
    /// </summary>
    public IDictionary<string, IMultipartItem> MultipartItemList
    {
        get
        {
            return _multipartItemList;

        }
        set
        {
            _multipartItemList = value;
        }
    }

##### 2.2.3.2 Executeメソッドの実装

IUploadBLogicインターフェイスで定義されているExecuteメソッドにアップロード処理を実装する。クライアントから受信したマルチパートデータ数だけ、下記の処理を行う。

- マルチパートデータのリストからServer Frameworkが提供しているIMultipartItemインスタンスを取得する。
  - IMulitpartItemインスタンスのIsTextプロパティを利用し、クライアントから送信されたマルチーパートデータが、テキストかどうかチェックする。
    - IsTextプロパティがfalseの場合(送信されたマルチパートデータはファイル)
      - 送信されたマルチパートファイルを指定されたディレクトリ(Workディレクトリ)に保存する。
    - IsTextプロパティがtrueの場合(送信されたマルチパートデータはテキスト)
      - 特に何も処理をしない。

MultipartUploadBLogic.cs

    using System;
    using System.Collections.Generic;
    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>
        /// マルチパート形式のアップロードを行う <see cref="IUploadBLogic"/> 実装クラスです。
        /// </summary>
        [ControllerInfo(RequestType = RequestTypeNames.MULTIPART_UPLOAD)]
        public class MultipartUploadBLogic : IUploadBLogic
        {
            /// <summary>
            /// 送信されてきたマルチパートデータを保持するフィールド。
            /// </summary>
            private IDictionary<string, IMultipartItem> _multipartItemList = null;

            /// <summary>
            /// 送信されてきたマルチパートデータの設定・取得をします。
            /// </summary>
            public IDictionary<string, IMultipartItem> MultipartItemList
            {
                get
                {
                    return _multipartItemList;

                }
                set
                {
                    _multipartItemList = value;
                }
            }

            /// <summary>
            /// ファイルアップロードのディレクトリー
            /// </summary>
            private static readonly string UPLOAD_FILE_DIRECTORY = "~/Work/{0}";

            /// <summary>
            /// マルチパート形式のアップロード処理を行います。
            /// </summary>
            /// <param name="param">ビジネスロック入力クラス。</param>
            /// <returns>ビジネスロジック結果クラス。</returns>
            public BLogicResult Execute(BLogicParam param)
            {
                FileUploadDs resultDs = new FileUploadDs();
                if (_multipartItemList.Count != 0)
                {
                    resultDs.ResultTable.AddResultTableRow(true);
                }
                else
                {
                    resultDs.ResultTable.AddResultTableRow(false);
                }

                foreach (IMultipartItem item in _multipartItemList.Values)
                {
                    // ファイルかどうかのチェック
                    if (!item.IsText)
                    {
                        MultipartFileItem fileItem = item as MultipartFileItem;
                        string uploadFileName = string.Format(UPLOAD_FILE_DIRECTORY, Path.GetFileName(fileItem.Filename));
                        string fileName = HttpContext.Current.Server.MapPath(uploadFileName);
                        using (FileStream stream = new FileStream(fileName, FileMode.Create))
                        {
                            byte[] buffer = new byte[256];
                            int readsize = 0;
                            while ((readsize = fileItem.OutputStream.Read(buffer, 0, 256)) != 0)
                            {
                                stream.Write(buffer, 0, readsize);
                            }
                            stream.Flush();
                        }
                    }
                    else
                    {
                        //テキストの場合は、省略。
                    }
                }
                return new BLogicResult(BLogicResult.SUCCESS, resultDs);
            }
        }
    }

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

ビジネスロジック設定ファイル(Config/BLogicConfiguration.config)に、ファイルアップロードビジネスロジックのビジネスロジック名とアセンブリ修飾名を設定する。ビジネスロジック名はリクエスト名と一致させること。ファイルアップロード処理のリクエスト名は、サーバが受信するリクエストの仕様を参照すること。

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" />

    </blogicConfiguration>

## 3 動作確認

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

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

4. ファイルアップロード画面ボタンを押下する。

図3-2 メニュー画面⇒ファイルアップロード画面

5. 追加ボタンをクリックし、送信するファイルを選択する。(複数選択可能)

図3-3 ファイルアップロード画面(ファイル追加)

6. ファイルアップロードボタンを押下し、アップロード成功画面がポップアップすることを確認する。

図3-4 ファイルアップロード画面⇒アップロード成功画面

7. サーバにアップロードしたファイルが存在することを確認する。

次節：3.3 ファイルダウンロード通信