2010年09月07日

vaadinでファイルダウンロード

vaadinでファイルのダウンロードは簡単すぎるせいなのか、Samplerにも用意されていません。
私としてはメモをどこかにまとめてくれてあったらありがたいと思ったので、ここに記載しておきます。

基本的には、Window#open() メソッドを利用します。
このメソッドは、対象のリソースをブラウザに表示します。
ブラウザで表示ではなく、プログラムで開くか保存するかの選択ダイアログでの出力が目的なので、FileResource に Content-Disposition ヘッダを指定するようにします。
具体的には、FileResource を継承して getStream() をオーバーライドします。
ほとんど FileResource と同じですが、setParameter() で Content-Disposition ヘッダを指定する処理を追加しています。
public class FileDownloadResource extends FileResource {
  public FileDownloadResource(File sourceFile, Application application) {
    super(sourceFile, application);
  }

  @Override
  public DownloadStream getStream() {
    try {
      final DownloadStream ds = new DownloadStream(new FileInputStream(
                                     getSourceFile()), getMIMEType(), getFilename());
      ds.setParameter("Content-Disposition", "attachment; filename*=" + getFilename());
      ds.setCacheTime(getCacheTime());
      return ds;
    } catch (final FileNotFoundException e) {
      return null;
    }
  }
}
呼び出しは下記のようになります。
  ServletContext servletContext
    = ((WebApplicationContext) getContext()).getHttpSession().getServletContext();
  File file = new File(servletContext.getRealPath("お試しファイル.txt"));
  getMainWindow().open(new FileDownloadResource(file, getApplication()));
これで保存するか開くかの確認ダイアログが開きます。
このままめでたしめでたしのはずでしたが、やはり何かが起こるものです。

ダイアログに表示されているファイル名が文字化けしています。
Internet Explorere 8.0 や Google Chrome 6.0、Safari 5.0 では文字化けが起こらず、FireFox 3.6 のみが文字化けが起こります。
普段私が使うブラウザが文字化けでは困るので何とか対策を考えてみます。
Content-Disposition ヘッダのファイル名に対する処理が、各ブラウザごとに異なるのが原因のようです。
ここから先はvaadinの話ではないですが、乗りかかった船なので解決するまで進んでみます。
ネットで解決策を検索してみると、「ブラウザごとに処理を変えて・・・」とありましたが、 そんなことはしたくないですね。
※ 参考にしたページの動作確認と、私の確認方法が異なるようですが、この件は深くは追いません。
上記すべてのブラウザで日本語ファイル名が正しく表示できた方法を記載します。
URLエンコードしたファイル名を用い、ファイル名の前に「filename*=utf8'URLエンコードされたファイル名」とします。
上記 getStream() の該当箇所を下記ソースに置き換えてください。
  String encodedFileName = URLEncoder.encode(getFilename(), "UTF-8");
  ds.setParameter("Content-Disposition", "attachment; filename*=utf8'" + encodedFileName);
まだ文字化けの件は、古いブラウザなどすべてを見切れていませんが、問題が出てくるまではこのソース利用してみます。
ラベル:vaadin
posted by しん at 00:00| Comment(0) | vaadin | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。