Seasar2 ファイルのダウンロード機能を作る

Seasar2 でファイルをアップロードする方法について完結に書かれているいい感じのサイトが
うまく見つからなかったので、自分の為にもメモ。

code

public class DownloadAction {

	@Resource(name = "application")
	public ServletContext app;

	@Execute(validator = false)
	public String setting() {
		try {
			ResponseUtil.download(
					URLEncoder.encode("ダウンロードさせるファイル名.xlsx", "UTF-8"), 
					new FileInputStream(
					    new File(app.getRealPath("/WEB-INF/template/company-setting.xlsx"))
					)
			);

		} catch (FileNotFoundException e) {
			new AppException("ダウンロードさせるファイル取得時に問題が発生しました.", e);

		} catch (UnsupportedEncodingException e) {
			new AppException("ダウンロードさせるファイル名生成時に問題が発生しました.", e);
		}
		return null;
	}
}

ServletContext app (4行目)

4行目の ServletContext は、ダウンロードさせるファイルの実際の場所を指定するために使います。
Eclipseで開発中は使わなくてもいいかもしれませんが、本番にアップするとデプロイ先のファイルをきちんと指定しないといけないですからな。
12行目で使用してます。
getRealPath であんなふうに指定すると、実際のパスに置換して返してくれます。

日本語ファイル名としてダウンロードさせる場合はURLエンコード

プロジェクト上は、いちおう開発リソースなので英語のファイル名がいいでしょうけど、ユーザにダウンロードしてもらうときは日本語のファイル名に変更してあげたいですよね。

その場合は、URLエンコードを施してください。HTTPに乗って送られてくる時に、生の日本語のままだと化けまくってエラいことになってしまいます。いったんURL専用のアスキー文字に変換して送れば、ブラウザがユーザに渡すときにデコードしてくれます。

return する文字列は null

22行目で ResponseUtil が代わりにファイルデータをレスポンスに詰めて返してくれるので、内部のフォワードは不要です。
return null しましょう。 確か、何か文字を指定してしまうと「レスポンスを2回返してるぞ!」というエラーが発生したと思います。たしか。

setting

日本語ファイル名でダウンロードさせる場合には、少し注意。(英語のファイル名を使うなら問題ないです)
Tomcat での server.xml にオプションを少し追加です。

5~6行目が追加したオプションです。
データのインタフェースとなる「URIをエンコードしたまえ」、という指定ですな。

<Connector 
    connectionTimeout="20000" 
    port="8080" 
    protocol="HTTP/1.1" 
    URIEncoding="UTF-8" 
    useBodyEncodingForURI="true" 
    redirectPort="8443"/>

Apache web サーバと連携してAJPを使用している場合は以下もですかね。
4~5行目が追加したオプション。内容は上と一緒です。

<Connector
    port="8009"
    protocol="AJP/1.3"
    URIEncoding="UTF-8"
    useBodyEncodingForURI="true"
    redirectPort="8443" />

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL