いっぽんの猟銃のむこうに (DAIZOじいさんとGun)

ヌルめの技術メモとか。フリーランスやってます (http://acez.jp/)

投げやりにSIer特有の画面ポップアップ&ファイルダウンロードコンボを実装する

「クリックしたらポップアップウィンドウが出て、自動的にファイルのダウンロードが始まり、終わったらファイルの保存ダイアログを出して、ダウンロードが終了したらポップアップのウィンドウ自体は自動的に閉じる(ただし途中でエラーが発生した場合は表示)」などという、非常にSIerらしい、とても斜め上のご用件がありまして、XHRを使ったりlocation.hrefでごにょごにょしたりという、素晴らしく非生産的な行為に半日くらい費やしてしまったので、メモ。

ちなみにIE6です。

ポイントは以下。

  • XHR(XmlHttpRequest)で、ダイアログを表示させるようなファイルダウンロード(所謂application/octet-stream)はできない(responseText、responseXMLのどちらでもないため) 叩くとreadyState = 4 & 200番とか帰ってくるが騙されるな
  • location.hrefだと画面遷移(この場合はファイルダウンロード)を終えきってからウィンドウを閉じる、などができない(もしかしたら色々頑張ればできるのかもしれない)
  • しかも、IE6でlocation.hrefでファイルダウンロードAPIを叩くとまったくステータスバーが動かないので、画面的に何が起きてるのかわからなくてユーザ様がお怒り

というわけで、結論的にはiframeに落ち着きました(死にたい)

こんな感じのHTMLをwindow.open()等で開いてさしあげます。(僕はもちろんモーダルウインドウを強いられ白目)


<...>




これだけでiframeのsrc指定したものが自動的に叩かれ、終わったらiframeのonload -> body onload の順番で指定した関数が呼ばれます。iframeのonloadは500とか食らうと発生しない(#1, #2)ので、適当にフラグとか持たせれば簡単にエラーハンドリングができました。iframeが見えるの嫌ならdisplay:noneとかしてやればよろしいです。

しかし、さすがに今時、IE6のXHR(MSXML2.XMLHTTP)を生で書くはめになるとは思いませんでした。SIerは広大ですね……。あとJavascriptは一回マジに勉強せんといかんとおもいました。はーつら


#1 これはもしかするとIE6特有の挙動かもしれません。インターネットに繋がらずFirefoxすら入れることを許されないというアウシュビッツみたいな職場でテーブルタグにこらしめられたのでもはや手元の環境で試す気にもなれず

#2 システムテストでIPがインターネット上になったとたん、この方法では動かなくなりました。IE6 sp2の場合iframeでダウンロードさせるにはセキュリティゾーンで認可されたサイトになるように設定してあげるか、セキュリティの権限をいじってあげる必要があるようです。僕の場合はなんだかようわからないですけどお客さんがブラウザ側で設定してくれることになりました。なので正直、ここに書いてある実装はあんまりよろしくないです。