石橋 稔章(いしばし としあき)
株式会社DTSネットワーク事業本部所属。金融機関向けのフレームワークの開発・保守,プロジェクト支援に携わる。

 今回は,SpringMVCを利用した,ファイル・アップロード機能の実装方法について解説します。

 具体的な解説に入る前に,ファイル・アップロードについて少し説明したいと思います。ファイル・アップロードを実装するのは,従来のサーブレットとJSPだけではとても難しいことでした。最近では,ファイル・アップロードを行うためのライブラリも充実し,実装しやすくなりました。それでもなお,ファイル・アップロードに対して,苦手意識を持っている人が少なくないように感じます。その理由について,筆者は以下のように推測します。

(1)データの送受信の仕組みがわかりにくい

 ファイル・アップロードでは,入力画面から「マルチパート」という形式のリクエストでデータを送信する必要があります。送信するデータは,区切り文字によって区切られた一つのデータとして送られます。サーバーでは,受信したリクエストがマルチパートであるかどうかを判断する必要があります。マルチパートなリクエストの場合は,区切り文字で区切られた各ブロックからデータを取り出します。データの送受信は,ファイル・アップロードを実装するうえで,わかりにくい点の一つであると言えます。

(2)文字化けを防ぐには,どうすればよいのかわかりにくい

 ファイル名に日本語が含まれる場合,文字コードの指定が正しく行われていないと文字化けする可能性があります。クライアントでリクエストにファイル名を書き込む文字コードと,サーバーでファイル名を読み込む文字コードを同じにする必要があります。ファイルに日本語が含まれる場合にも,ファイルを送信する際に利用する文字コードとファイル自体の文字コードが違う場合,文字化けする可能性があります。

(3)ファイルの操作が苦手

 サーバーでファイルを取り扱うには,ストリームという形式で扱う必要があります。ストリームは,Java言語においてわかりにくい概念の一つです。

 図1は,ファイル・アップロードで行う代表的な処理と,上記のわかりにくいポイントを示した図です。

図1●ファイル・アップロードの代表的な処理とわかりにくい点
図1●ファイル・アップロードの代表的な処理とわかりにくい点

 このように,ファイル・アップロードにはいくつかわかりにくい点があり,苦手意識を感じさせる原因となっています。SpringMVCが提供する機能を利用することで,これらの問題をあまり意識せずに,ファイル・アップロードを実装できるようになります。SpringMVCでは表1の機能を提供しています。

表1●SpringMVCが提供するファイル・アップロード機能
機能 説明
マルチパート・
サポート
bean定義ファイルに設定することで,マルチパート・リクエストが送信されてくると,自動的にマルチパートなリクエストとして扱う。また,bean定義ファイルに文字コードなどを指定できる
ファイル型の提供 SpringMVCの用意するファイル型を利用することで,簡単にファイルを取り扱うことができる

 前述の(1)の問題を解決する仕組みとして,マルチパート・サポートがあります。SpringMVCの機能を利用することで,入力画面からマルチパートでリクエストを送信すれば,自動的に判断し,処理を行ってくれます。

 また,(2)を解決する仕組みとして,bean定義ファイルにマルチパート・サポートを設定する際に,文字コードも同時に設定できます。ただし,文字化けする原因は,JSPファイルやファイル自体の文字コードなど,ほかにも考えられるため,すべての文字化けが解決できるわけではありません。

 (3)を解決する仕組みとして,ファイル型が提供されています。ファイル型を利用すると,ストリーム形式のファイルを意識せずに実装することができます。

 SpringMVCでは,表1の機能を実現するために二つの方法を用意しています。一つは,Apache Commonsプロジェクトから提供されているCommons FileUploadパッケージを利用する方法です。もう一つは,Jason Hunter氏のcom.oreilly.servletパッケージ(以下,COS)に含まれるファイル・アップロードの機能を利用する方法です。二つの特徴について,表2にまとめます。

表2●Commons FileUploadとCOSの特徴
パッケージ 特徴
Commons FileUpload ファイル・アップロード機能を提供する。利用者が多く,情報が比較的手に入りやすいという特徴がある
COS ファイル・アップロード機能を提供する。実装するには,MultipartRequestクラスかMultipartParserクラスを利用する。利用者が少なく,情報が手に入りにくい。また,商用利用する場合は,Jason Hunter氏が書いた書籍『Javaサーブレットプログラミング 第2版』(発行 オライリー・ジャパン)をプロジェクトで用意しなければならないという制約がある

 今回は,適応事例も多く,情報も入手しやすいCommons FileUploadを利用して,図2のようなアプリケーションを作成します。短時間で作成できるので,実際に手を動かすと理解が深まります。

図2●サンプル・アプリケーションのイメージ1
図2●サンプル・アプリケーションのイメージ2
図2●サンプル・アプリケーションのイメージ

環境構築

 まずは,Eclipseでプロジェクトを作成します。Eclipseでのプロジェクトの作成からSpring MVCのセットアップまでの手順は,「第4回 SpringMVCの基本を知る」を参照してください。プロジェクト名は,任意ですが,ここではfileUploadSampleとします。

 環境設定が終わったら,Spring FrameworkおよびCommons FileUploadと,依存するライブラリでるCommons IOをダウンロードします。今回は,Springのバージョン2.5.1を利用するので,Commons FileUploadはバージョン1.1以上を利用する必要があります。

 解凍(展開)してできたjarファイルを,fileUploadSample/WebContent/WEB-INF/libにコピーします。Eclipseのパッケージ・エクスプローラーで,プロジェクトのWeb Appライブラリーに,コピーしたjarファイルが含まれていることを確認してください。これで環境構築は完了です。