ダウンロード/アップロード
件名だとわかりにくいのですが、大きなファイルをダウンロード・アップロードする際に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的にやってもいいのかな。
あと、「ダウンロード中のエラーはあえて無視」としているのは、ユーザがダウンロードを中断した場合にもエラーとなるので、それをいちいち拾わないためです。