Content-Disposition ヘッダのファイル保存命令の実験

実験のコーナーです。
WEB+DB PRESS を読んで、気になったことを試してみる。


WEB+DB PRESS Vol.48

WEB+DB PRESS Vol.48


気になったのは、以下のヘッダをレスポンスに含めることで、ブラウザに対して結果を表示するのではなくファイルに保存させるというはなしについて。

Content-Disposition: attachment; filename="foo.txt"


じゃあ、試してみようってことで、まず、こんなファイルをサーバ上に配置。

<%
response.addHeader("Content-Disposition", "attachment;filename=\"file1.txt\"");
%><%="This is file1.txt"%>

そして、IE 7、Firefox 3.0.5、Safari 3.2.1、Opera 9.6.3 の各ブラウザから、このファイルの URL に直接アクセスしてみる。
ちなみに環境は Windows Vista、サーバーは Tomcat 6 を使用、なのでファイルは JSP として作成した。


予想される結果は、「This is file1.txt」と内容に一行書かれた、file1.txt という名前のファイルが保存できること。


実行すると、IE と FF では予想のとおりの結果となった。
これに対して Safari では、file1.txt.html というファイル名になった。
そして Opera では、file1.htm というファイル名になった。
この二つは、表示される保存ダイアログで名前を変えてやれば好みの名前にすることはできるが、ヘッダで指定した名前とはデフォルトで異なるものになってしまった。


おしまい。
じゃない。
本当に気になったのは、このヘッダでブラウザがファイルを保存できるかではなくて、XMLHttpRequest を使ってファイルを保存できるかということ。
もっというと複数のファイルを同時にリクエストして保存できるかということ。


ということで、こんなファイルをサーバ上に用意してみた。
dl_service1.jsp

response.addHeader("Content-Disposition", "attachment;filename=\"file1.txt\"");
%><%="This is file1.txt"%>

dl_service2.jsp

response.addHeader("Content-Disposition", "attachment;filename=\"file2.txt\"");
%><%="This is file2.txt"%>

mult_file_dl_by_head.html

<html>
<head>
<script type="text/javascript" src="jquery-1.2.6.js"></script>
<script>
function callback(data) {
  document.body.innerHTML += "<br>" + data + "<br>complete";
}
function download() {
  $.get("dl_service1.jsp", callback);
  $.get("dl_service2.jsp", callback);
}
</script>
</head>
<body>
<input type="button" value="ダウンロード" onclick="download();">
</body>
</html>

3つめのファイルをブラウザから開いてボタンを押すと、XMLHttpRequest (ライブラリは jQuery を使用)が上の2つのファイルに GET リクエストを送る。
結果として2つのファイルが保存できるかもという淡い期待を抱いて実行。(そうなった場合に、コールバック関数は呼ばれるのかって疑問もあるけど)


結果は


残念。どのブラウザもコールバック関数が実行されておしまい。

Opera での結果

複数ファイルの保存どころか、ファイル一つをリクエストするように書き換えて試してみても同様の結果だった。


やるせない気持ちで仕方なくグーグル検索してみたら、複数ファイルの同時保存を別の方法で 634 さんがやってた。
http://634.ayumu-baby.com/javascript/js_multi_file_download.html
あ〜なるほど。そんな手があったのね。ってことで試してみた。
試した結果は、次のエントリで。