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()で一時ファイルの場所を知ることはできるものの、一時ファイルの名前を最初に指定することはできない。
これができると、アップロード状況の監視ができて面白いんですがね。。