目次 > 第3章 サンプルアプリケーション構築 > 3.4 通信処理機能 > 3.4.2 ファイルアップロード通信
3.4.2 ファイルアップロード通信
概要
本節ではClient Frameworkが提供するイベント処理機能及びファイルアップロード処理機能を用いて、クライアント・サーバ間でファイルアップロードを行う方法を説明する。
ファイルアップロード処理を行う場合は、画面からClient Frameworkが提供するファイルアップロード用のビジネスロジックを実行する。ファイルアップロード用のビジネスロジックは、ビジネスロジック入力データセットの情報をもとに、マルチパート形式でファイルをサーバにアップロードし、サーバから受信したXML電文をビジネスロジック出力データセットに変換する。
詳細は、機能説明書『FB-02 データセット変換機能』、『CM-04 ビジネスロジック生成機能』、『FC-02 ファイルアップロード機能』を参照のこと。
動作イメージ

図3.4.2-1 ファイルアップロード動作イメージ
- 対象画面
- ファイルアップロード画面(FileUploadForm.cs)
- 処理概要
- (クライアント)アップロードボタンを押下して、イベント処理機能を実行する。
- (クライアント)イベント処理機能は、マルチパート名とファイルパスをビジネスロジック入力データセットにコピーし、ファイルアップロード用ビジネスロジックを実行する。
- (クライアント)ファイルアップロード用ビジネスロジックは、ビジネスロジック入力データセットに設定されたファイルパスに保存されたファイルを、マルチパート形式でサーバにアップロードする。
- (サーバ)サーバのビジネスロジックは、アップロードされたファイルをサーバのローカル領域に保存する。
- (サーバ)サーバのビジネスロジックは、アップロードの成否をクライアントへ送信する。
- (クライアント)ファイルアップロード用ビジネスロジックは、受信したXMLをビジネスロジック出力データセットに変換する。
- (クライアント)イベント処理機能は、ビジネスロジック出力データセットに格納された情報を画面データセットにコピーする。
- (クライアント)アップロードの成否をポップアップ画面で表示する。
クライアントが送信するリクエストの仕様
リクエストヘッダにはリクエスト名"multipartUpload"を設定する。リクエスト名によって実行するサーバのビジネスロジックが決定する。リクエストボディには、アップロードするファイルデータをマルチパート形式で設定する。1つのリクエストで複数のファイルデータを送信することも可能である。
- リクエストヘッダ
表3.4.2-1 リクエストヘッダの内容
| Key値 | Value値 | 内容 |
| RequestName | multipartUpload | サーバで実行するビジネスロジックを特定するためのリクエスト名。 |
クラアントが受信するレスポンスの仕様
アップロードの成否をXMLとして受信する。
- レスポンスボディ
<FileUploadDs xmln="http://com.example.dotnet/FileUploadDs.xsd"> <ReseultTable> <Result>true</Result> </ResultTable> </FileUploadDs>
作業手順
- 作成イメージ

図3.4.2-2 ファイルアップロード通信作業イメージ
- 業務画面の確認
- 画面データセットの作成
- 画面項目と画面データセットのバインド
- データセット変換設定ファイルの設定
- ビジネスロジック設定ファイルの設定
- EventControllerコンポーネントのプロパティの追加
- EventControllerコンポーネントのプロパティの設定
- EventControllerコンポーネントの実行
1. 業務画面の確認
ファイルアップロード画面(FileUploadForm.cs)がVisualStudioデザイナに表示されることを確認する。また、ファイルアップロード画面が拡張フォーム(FormBase)を継承していることを確認する。

図3.4.2-3 ファイルアップロード画面の確認
FileUploadForm.cs
namespace TutorialClient
{
/// <summary>
/// ファイルアップロードを行う画面です。
/// </summary>
/// <remarks>
/// サーバへアップロードするファイルを複数選択しアップロードします。
/// </remarks>
public partial class FileUploadForm : FormBase
{
/// <summary>
/// <see cref="FileUploadForm"/>クラスの新しいインスタンスを初期化します。
/// </summary>
/// <remarks>
/// デフォルトコンストラクタです。
/// </remarks>
public FileUploadForm()
{
InitializeComponent();
}
}
}
2. 画面データセットの作成
2.1 画面データセットの新規作成
ファイルアップロード画面の画面データセット(FileUploadDs.xsd)を作成する。 第3章 3.1 画面作成時のポイントを参考にすること。
画面データセットには、FileテーブルとResultテーブルを追加する。Fileテーブルはファイルアップロード用に、ResultテーブルはXML受信用に使用する。
FileテーブルにはNameカラムとFilePathカラムを追加する。Nameカラムにはマルチパート要素名を、FilePathカラムにはファイルパスを設定する。マルチパート要素名についての詳細は、機能説明書『FC-02 ファイルアップロード機能』を参照のこと。
ResultTableテーブルにはResultカラムを追加する。Resultカラムには、サーバから返却されたアップロード成否フラグが格納される。
表3.4.2-2 データセットの格納場所とファイル名
| ファイル格納場所 | ファイル名 |
| \TutorialClient\ViewData | FileUploadDs.xsd |
表3.4.2-3 作成するデータセットの名前空間
| Namespace | http://com.example.dotnet/FileUploadDs.xsd |
表3.4.2-4 作成するデータセットのテーブル、カラム、データ型の一覧
| Table名 | Column名 | DataType(型) |
| File | ||
| Name | System.String | |
| FilePath | System.String | |
| ResultTable | ||
| Result | System.Boolean |

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

図3.4.2-5 データセットがコンポーネントに追加されている例
3. 画面項目と画面データセットのバインド
3.1 画面データセットのインスタンスの追加
ツールボックスからデータセット「fileUploadDs」のインスタンスをファイルアップロード画面へ追加する。追加したデータセットのインスタンスのNameプロパティを「fileUploadDs1」から「fileUploadDs」に変更する。

図3.4.2-6 画面データセットの追加
3.2 画面項目と画面データセットのバインド
ファイルアップロード画面のDataGridViewと画面データセットをバインドする。
表3.4.2-5 画面項目と画面データセットの対応一覧
| 画面項目名 | コントロール種別 | DataTable名 | Column(列)名 |
| ファイルパス | DataGridView | File | FilePath |
- DataGridViewと画面データセットをバインドするため、DataGridViewのプロパティを変更する。以下に設定項目を示す。
表3.4.2-6 DataGridViewプロパティ変更一覧
| プロパティ名 | 設定内容 | 詳細 |
| DataMember | File | データセットのデータテーブル名 |
| DataSource | fileUploadDs | 画面データセットのインスタンス |

図3.4.2-7 DataGridViewのプロパティ
- DataGridViewの列にDataGridViewで設定したデータテーブル(File)の列が追加されているため、表示情報として不要なName列を削除する。

図3.4.2-8 DataGridViewタスク画面

図3.4.2-9 Name列の削除
- FilePath列を選択後、FilePath列のプロパティを変更し、OKボタンを押下する。設定項目を以下に示す。
表3.4.2-7 FilePath列のプロパティ変更一覧
| プロパティ名 | 設定内容 | 詳細 |
| AutoSizeMode | Fill | 列のサイズを指定します。 |
| HeadertText | ファイルパス | 列の表示名を指定します。 |

図3.4.2-10 FilePath列のプロパティ
4. データセット変換設定ファイルの設定
データセット変換設定ファイル(ConversionConfiguration.config)に、画面データセットとビジネスロジック入出力データセットの変換仕様を定義する。 コンバートIDには"upload"を、param要素にはサーバに送信する画面データセットのカラム(NameおよびFilePath)を記述する。データセット変換設定ファイルの設定に関する詳細は、機能説明書『FB-02 データセット変換機能』を参照のこと。
ConversionConfiguration.config
<?xml version="1.0" encoding="utf-8" ?>
<!-- データセット変換設定ファイル -->
<conversionConfiguration xmlns="http://www.terasoluna.jp/schema/ConversionSchema.xsd">
・・・省略・・・
<convert id="upload">
<param>
<column src="File.Name"/>
<column src="File.FilePath"/>
</param>
<result>
</result>
</convert>
</conversionConfiguration>
5. ビジネスロジック設定ファイルの設定
ビジネスロジック設定ファイル(BLogicConfiguration.config)に、ファイルアップロードを実行するビジネスロジックを定義する。 ビジネスロジック名(name属性)には"multipartUploadBLogic"を、type属性にはClient Frameworkが提供するファイルアップロード用ビジネスロジッククラス(MultipartUploadBLogic)のアセンブリ修飾名を定義する。ビジネスロジック設定ファイルの設定に関する詳細は、機能説明書『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" /> </blogicConfiguration>
6. EventControllerコンポーネントのプロパティの追加
ツールボックスからEventControllerコンポーネントを追加する。

図3.4.2-11 EventControllerコンポーネント
7. EventControllerコンポーネントのプロパティの設定
ファイルアップロード画面クラスに追加したEventControllerコンポーネントのプロパティを設定する。 BLogicNameプロパティに 5.ビジネスロジック設定ファイルの設定 で設定したビジネスロジック名"multipartUploadBLogic"を指定することで、ファイルアップロードを行うことができる。

図3.4.2-12 uploadEventのプロパティの設定例
表3.4.2-8 uploadEventのプロパティの設定例
| プロパティ名 | 設定値 | 備考 |
| Name | uploadEvent | インスタンスの名前。 |
| ConvertId | upload | 4.データセット変換設定ファイルの設定 でデータセット変換設定ファイルに設定したコンバートID。 |
| BLogicName | multipartUploadBLogic | 5.ビジネスロジック設定ファイルの設定 でビジネスロジック設定ファイルに設定した、ファイルアップロードを行うビジネスロジック名。 |
| RequestName | multipartUpload | サーバで実行するビジネスロジックを特定するためのリクエスト名。 |
| ErrorHandler | FileUploadForm | IErrorHandler実装クラスのインスタンス。 |
| ViewData | fileUploadDs | 画面データセットのインスタンス。 |
8. EventControllerコンポーネントの実行
ファイルアップロード画面(FileUploadForm.cs)に配置された3つのボタンのクリックイベントハンドラを実装する。
8.1 追加ボタンのクリックイベントハンドラ
追加ボタンのクリックイベントハンドラには、アップロードするファイルを選択し、画面データセットにマルチパート要素名とファイルパスをバインドするロジックを実装する。
FileUploadForm.cs
/// <summary>
/// 追加ボタン押下時に実行されるイベントハンドラです。
/// </summary>
/// <remarks>アップロードするファイルのファイルパスを選択します。</remarks>
/// <param name="sender">イベントのソース。</param>
/// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
private void addButton_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
int count = fileUploadDs.File.Rows.Count + 1;
string name = "file"+ count.ToString("00");
fileUploadDs.File.AddFileRow(name, openFileDialog.FileName);
fileUploadDs.AcceptChanges();
}
}
ファイルアップロード用データセットのマルチパート要素(nameカラム)には「"File"+連番」を、ファイルパス(FileNameカラム)にはユーザがダイアログボックスで選択したファイルパスを設定する。
8.2 クリアボタンのクリックイベントハンドラ
クリアボタンのクリックイベントハンドラには、画面データセットの内容を削除するロジックを実装する。
FileUploadForm.cs
/// <summary>
/// クリアボタン押下時に実行されるイベントハンドラです。
/// </summary>
/// <remarks>参照先のファイルパスをクリアします。</remarks>
/// <param name="sender">イベントのソース。</param>
/// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
private void clearButton_Click(object sender, EventArgs e)
{
fileUploadDs.File.Clear();
fileUploadDs.AcceptChanges();
}
8.3 アップロードボタンのクリックイベントハンドラ
アップロードボタンのクリックイベントハンドラには、 5.ビジネスロジック設定ファイルの設定 でプロパティ設定を行ったEventControllerを実行するロジックを実装する。
FileUploadForm.cs
/// <summary>
/// アップロードボタン押下時に実行されるイベントハンドラです。
/// </summary>
/// <remarks>ファイルアップロード処理を実行します。</remarks>
/// <param name="sender">イベントのソース。</param>
/// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
private void uploadButton_Click(object sender, EventArgs e)
{
// ファイルが0個でないことのチェック
if (fileUploadDs.File.Count == 0)
{
MessageBox.Show(Properties.Resources.UPLOAD_SELECT);
return;
}
// ファイルアップロード処理の実行
ExecutionResult result = uploadEvent.Execute();
//サーバとの通信成功
if (result.Success)
{
FileUploadDs resultDs = result.BLogicResultData as FileUploadDs;
if (resultDs.ResultTable[0].Result)
{
//サーバビジネスロジック正常終了
MessageBox.Show(Properties.Resources.UPLOAD_SUCCESS, Properties.Resources.UPLOAD_FORM_SUCCESS);
}
else
{
//サーバビジネスロジック業務エラー
MessageBox.Show(Properties.Resources.UPLOAD_FAILURE, Properties.Resources.UPLOAD_FORM_FAILURE);
}
}
}
EventControllerのExecuteメソッドを実行して、サーバにファイルを送信する。サーバとの通信が成功した場合、Executeメソッドの戻り値ExecutionResultにSUCCESSが格納される。通信が成功してさらに、サーバのビジネスロジックも正常終了して、戻り値としてtrueが返ってきた場合は、メッセージボックスに成功メッセージを表示する。ファイルが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>
- クライアントアプリケーションを起動する(デバッグ⇒デバッグなしで開始)。
- ユーザID "tera"、パスワード "soluna" と入力し、ログオンボタンを押下する。

図3.4.2-13 ログオン画面⇒メニュー画面
- ファイルアップロード画面ボタンを押下する。

図3.4.2-14 メニュー画面⇒ファイルアップロード画面
- 追加ボタンをクリックし、送信するファイルを選択する。(複数選択可能)

図3.4.2-15 ファイルアップロード画面(ファイル追加)
- ファイルアップロードボタンを押下し、アップロード成功画面がポップアップすることを確認する。

図3.4.2-16 ファイルアップロード画面⇒アップロード成功画面
- サーバにアップロードしたファイルが "C:\Inetpub\wwwroot\TutorialServerRich\Work" に存在することを確認する。
