• ベストアンサー

Excelファイルをダウンロード

Webページ上のあるボタンを押した時、サーバー上にExcelファイルを作成し、そのファイルをそのままクライアントにダウンロードするプログラムをつくろうとしています。その時、ダウンロードダイアログを表示させ、クライアントが任意の場所に保存できるようにしようと思っています。とりあえずファイルをダウンロードするクラスを下記のように作りました。 public class download { public static final int EOF=-1; public void downloader(HttpServletResponse res){ try { String fileName = "testExcel1.xls"; String CONTENT_TYPE = "application/atom"; res.setContentType(CONTENT_TYPE); res.setHeader("Content-Disposition", "filename=\""+ fileName +"\""); URL urlObj=new URL("サーバーアドレス:8080/DB/testExcel.xls"); InputStream in = urlObj.openStream(); FileOutputStream(new File("testExcel1.xls")); BufferedOutputStream bout= new BufferedOutputStream(res.getOutputStream()); int c; while( (c = in.read()) != EOF ) { bout.write(c); } bout.flush(); in.close(); } catch (Exception e ) { e.printStackTrace(); } } } このまま実行するとダウンロードダイアログは表示されず、Excelファイルの内容がクライアントのブラウザ上に表示されてしまします。どうしたらダウンロードダイアログが表示されるようになるでしょうか。アドバイスよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mrt136
  • ベストアンサー率35% (33/92)
回答No.2

setHeader の filename の前に attachment; を付けてみてはどうですか? res.setHeader("Content-Disposition", "attachment; filename=\""+ fileName +"\"");

amuro1980
質問者

お礼

回答ありがとうございます。 アドバイスどおりやったらうまくいきました。今回のような場合IEのほうではやり方が多少違うようですね。大変勉強になりました。

その他の回答 (1)

  • Runx
  • ベストアンサー率71% (5/7)
回答No.1

あまり自信はないのですが、 MIMEタイプを application/octet-stream としたら どうですか?

amuro1980
質問者

補足

回答ありがとうございます。 試してみたところ残念ながら結果は変わらなかったです。 String fileName = "testExcel1.xls"; の.xlsをなくすか、適当な拡張子(.demoとか)にするといけるのですがそうすると「名前を付けて保存」ダイアログのデフォルトのファイル名がxlsファイルではなくなくなってしまいます。 また原因を調べてみると http://www.nishimoto-site.net/archiver/ML/apache-ML/200009/msg00006.html で 「IEは "拡張子" を見て動作するような実装と聞いています。 Netscape はきちんと Content-Type: を見るようです。」 という文があったのですが、これが原因ですかね。ちなみにブラウザはIE5.5です。なにかいい方法はあるでしょうか。