Jakarta Commons FileUploadで一時ファイルの指定ができないか。

使用メモリを肥大化することなく、アーカイブしながらアップロードすることはできるのか?について調査してたついでに。
以前にも同じこと調べた気がする...

Commons FileUpload 1.2にて。

  • DiskFileItemFactory#setSizeThreshold(int)
  • DiskFileItemFactory#setRepository(java.io.File)

の組み合わせで実装することができそう。

public class UploadServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html; charset=UTF-8");
    request.setCharacterEncoding("UTF-8");
    PrintWriter out = response.getWriter();

    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(4096); // バッファサイズ
    factory.setRepository(new File("c:/temp")); // 一時ファイル保存先

    ServletFileUpload sfu = new ServletFileUpload(
      factory);
    sfu.setFileSizeMax(100 * 1024 * 1024); // 上限(100MB)
    try {
      Iterator it = sfu.parseRequest(request).iterator();
      while (it.hasNext()) {
        FileItem item = (FileItem) it.next();
        File f = ((DiskFileItem) item).getStoreLocation();
        out.println(f.getCanonicalPath()); // 一時ファイルの保存先
      }
    } catch (FileUploadException e) {
      e.printStackTrace();
    }
  }
}

DiskFileItem#getStoreLocation()で一時ファイルの場所を知ることはできるものの、一時ファイルの名前を最初に指定することはできない。

これができると、アップロード状況の監視ができて面白いんですがね。。