そういえば、前の会社でちょっと悩んだことがあったな…と思ったので、忘れないうちにメモしておくことにします。要は Content-Type エンティティ・ヘッダフィールドの指定なのだけれど。perl で書くなら、以下のような感じでしょうか。
my $file; open(DL, $download_file); read(DL, $file, (-s $download_file)); close(DL); $download_file = substr($download_file, (rindex($download_file, "/") + 1) ); print "Content-type: application/octet-stream\n"; print "Content-disposition: attachment; filename=\"$download_file\"\n\n"; print $file;
Content-disposition を Content-type より先に記述したら、なぜかダウンロードしたファイルにContent-disposition の内容が記述されていたので Content-type を先に送るようにしました。
あと、IEは Content-Type エンティティ・ヘッダフィールドの指定をあまり気にしてくれず、ファイルの中身を見て判断したりしやがるので、テキストファイルだと普通にブラウザに表示したりします。「Content-Type:text/download」を指定すればうまくいく可能性があるにはあるけれど、結局のところIEのこの辺りの挙動はとにかく信用できないので、ユーザには右クリックから保存してもらうのが無難かと思われます。
Comments