ダウンロード/アップロード

[SASTRUTS-100] アップロード/ダウンロード用のユーティリティでデータをオンメモリで持たないようにする対応 - The Seasar Foundation Issues (Deprecated)

件名だとわかりにくいのですが、大きなファイルをダウンロード・アップロードする際にOutOfMemoryErrorを避けるためのものです。
アップロードの方法は特に変わりません。
ダウンロードの時、大きなデータをダウンロードさせる場合は、以下のようにResponseUtil.download(String,InputStream[,length])を使ってください(例は適当です)。

	@Execute(validator = false)
	public String download() {
                File file = new File("c:/temp/large.txt");
		try {
			ResponseUtil.download("hello.txt", 
                            new BufferedInputStream(
                              new FileInputStream(file)), (int)file.length);
		//ダウンロード中のエラーは
		} catch (IORuntimeException ire) {
			//あえて無視
		} catch (IOException e) {
			throw new IORuntimeException(e);
		}
		return null;
	}

lengthをintにキャストしているのは、HttpServletResponse#setContentLength(int size)の引数がintだからです。

2GBより大きいファイルを指定したいときはHttpServletResponse#setHeader(String headerName, String value)を使えばできる・・・ようにも思われますが、RFC的にやってもいいのかな。

あと、「ダウンロード中のエラーはあえて無視」としているのは、ユーザがダウンロードを中断した場合にもエラーとなるので、それをいちいち拾わないためです。