妄想その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と通信させてみる、になるはずです。