Strutsでのダウンロード(サンプル)

Strutsでのアップロード処理についてサンプルを書いたので、ついでにダウンロードについてもサンプルを掲載します。

アップロード処理と違ってStrutsの機能はなにも用意されていません。一般的なWebアプリケーションのダウンロードと一緒です。

ポイントは3つです。

  • HTTPヘッダの出力
  • レスポンスストリームに直接出力する。
  • forwardしない


ダウンロード処理は、画面遷移がありません
画面遷移とは「表示するページを出力する処理」になりますが、これがない代わりに、ダウンロードファイルの内容を出力します。

ダウンロード画面はこんなイメージです。
画面イメージ
入力値は、ダウンロード処理に関係ないのですが、ここでは出力されるCSVファイルの行数を指定しています。
行数というのは、入力値を受け取る例として用意しただけで、ダウンロード処理そのものには関係ありません。

ダウンロードボタンを押下すると、保存ダイアログが表示されます。
保存ダイアログ
この保存ダイアログは、ブラウザの機能によって表示しているため、ここのデザインを変えたいとしても変えることはできません。

Action

ブラウザに対してHTMLを出力するのではなく、「ダウンロードするためのデータを出力するよ」と指定することで、ブラウザは保存ダイアログを表示してくれます。これが「HTTPヘッダの出力」です。


//HTTPヘッダの出力
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition",
	"attachment; filename=\"" + filename + "\"");

ContentTypeとして、application/octet-streamを出力すると、保存ダイアログが表示されるようになります。次のヘッダは、保存ダイアログに表示されるファイル名を指定しています。

保存ダイアログのファイル名は、日本語を表示するために、次のようにしています。

String filename = new String(
	"ダウンロードサンプル.csv".getBytes("Windows-31J"), "ISO-8859-1");

これで全てのブラウザで問題ないかどうかは確認していません。(少なくともWindows上の、IE6.0やFirefox2.0では正しく日本語のファイル名でダウンロードできました。)

レスポンスストリームには、ファイルの中身を出力することになります。


PrintWriter out = new PrintWriter(
		new OutputStreamWriter(response.getOutputStream(), "Windows-31J"));
for (int i = 0; i < count; i++){
	out.print("表示サンプルデータ" + i + "-A");
	out.print(",");
	out.print("表示サンプルデータ" + i + "-B");
	out.print(",");
	out.print("表示サンプルデータ" + i + "-C");
	out.print(",");
	out.println();
}

ここでは、CSV形式のテキストデータを出力するため、PrintWriterを使ってファイル内容を出力しています。
PrintWriterオブジェクトは、元をたどると、HTTPServletReponse(ブラウザへの出力ストリーム)から作成しています。
データの作成方法は、DBからの検索結果で作成したりと、色々なやり方があると思います。

forwardしない」というのはStrutsのAction処理の話です。
Actionのメソッドの戻り値は、ActionForwardを返す仕様になっていますが、ダウンロード処理の場合は画面遷移がないため、forwardしてはいけません。ここはnullを返すようにします。
return null;

サンプルのダウンロード