ファイルのアップロードやダウンロードはどうやるの?
ファイルのアップロード
JakartaのCommonsのFileUploadコンポーネントを内部的に使用しているUploadコンポーネントが標準で提供されています。
Uploadコンポーネントは、input type="file"のタグをレンダリングし、submit時にorg.apache.tapestry.request.IUploadFileのインスタンスとしてページに渡されます。
詳しくはこちら
ファイルのダウロード
こんな感じでいけます。*1
public void downloadAction(IRequestCycle cycle) { try { HttpServletResponse response = cycle.getRequestContext().getResponse(); byte[] data = new byte[1024]; FileInputStream in = document.getFileInputstream(); response.setHeader("Content-disposition", "inline; filename=" + document.getFileName()); response.setContentType(document.getMimeType()); response.setContentLength(new Long(document.getSize()).intValue()); ServletOutputStream out = response.getOutputStream(); while (in.read(data) > -1) { out.write(data); } in.close(); response.flushBuffer(); } catch (IOException e) { e.printStackTrace(); } }
ちなみに、上記は英語文化圏のコードなので日本語ファイル名は考慮されていません。
日本語は何かと文字化けしがちなのですが、12行目付近を
response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(document.getFileName().getBytes("Windows-31J"), "ISO8859_1") + "\"");
こんな感じにしてみるとうまくいくかもしれません。
*1:http://jakarta.apache.org/tapestry/faq.htmlの「2.7. How do I stream a file to the user from tapestry?」より。