egapの日記(砂上の楼閣)

2004-12-18

[]ファイルアップロードダウンロードはどうやるの?

ファイルアップロード

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") + "\"");

こんな感じにしてみるとうまくいくかもしれません。

[]S2リリース履歴

過去のリリースは、こちらで公開されているようです。

*1http://jakarta.apache.org/tapestry/faq.htmlの「2.7. How do I stream a file to the user from tapestry?」より。

トラックバック - http://d.hatena.ne.jp/egap/20041218