妄想その7 -FileUpload-


前回AMF通信をやれるところまで説明したので、続いてはFileUploadです。
FileUploadは軟弱にcommon-fileupload、commons-ioを使ってます。


もちろんFilterベースでの実現なので、このあたりはMyFacesあたりを参考にしつつ、
やってみました。


まずはjspはというと、

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>アップロードサンプル</title>
</head>
<body>
<form action="samples/upload" method="post" enctype="multipart/form-data">
	<input type="file" name="aaa" />
	<br />
	<span>${fileUploadResult}</span><br />
	<input type="submit" name="upload" value="1つだけファイルアップロード"/>
</form>
</body>
</html>


シンプルにfileをひとつアップロードするだけの画面です。
続いて、対応するPOJO(Page)クラスとしては、以下のようなものを準備。

@Page("upload")
public class UploadPage {

	@Default
	public Navigation index() {
		return Forward.to("/jsp/upload.jsp");
	}

	/**
	 * @param file
	 * @param request
	 * @return
	 */
	@POST
	@ActionParam
	public Navigation upload(UploadFile file, HttpServletRequest request) {
		System.out.println("file:" + file.getName());
		System.out.println("size:" + file.getSize());
		System.out.println("contentType:" + file.getContentType());
		request.setAttribute("fileUploadResult", file.getName()
				+ " is uploaded.");
		return Forward.to("/jsp/upload.jsp");
	}
}


これでUploadFileが引数でわたってきます。
しかしこれだと複数の場合に対応できないので、複数の場合は引数を配列にしてあげます。

	@POST
	@ActionParam
	public Navigation upload2(UploadFile[] files, HttpServletRequest request) {
		StringBuilder builder = new StringBuilder();
		for (UploadFile file : files) {
			System.out.println("file:" + file.getName());
			System.out.println("size:" + file.getSize());
			System.out.println("contentType:" + file.getContentType());
			builder.append(file.getName());
			builder.append(", ");
		}
		builder.setLength(builder.length() - 2);
		request.setAttribute("fileUploadResult", builder.toString()
				+ " is uploaded.");
		return Forward.to("/jsp/upload.jsp");
	}


引数アノテーションをつけるかで悩んでたのですが、型である程度の明示性が示せれているので
デフォルトではつけなくてもいいかなと思っています。(一応@Uploadを準備してます。)


次回はSilverlightと通信させてみる、になるはずです。