ヘッダ出力に手を抜いてハマる

PHPでの話です。といっても、PHPに限った話ではなさそうですが。
サーバでスクリプトを経由してファイルをダウンロードさせるには、Content-Typeさえ書いておけばとりあえず動いたりします。
さらにContent-Disposition: attachemnt; filename=”hoge.png”とでもしておけば、保存時のファイル名も指定できます。
で、これで満足してました。
通常の画像とかテキストであれば特に問題はなかったのですが、テキストで始まって途中にバイナリが混ざるファイル、そうPDFではだめでした。
PHPではバッファとか内部何とかとか、なくてもいい余計なものがたくさんあるので、それに振り回されます。
今回必要だったのは、mb_http_output(”pass”);
テキストで始まるものは強制的に内部エンコを行うためか、途中のバイナリが破壊されてしまうようです。それを回避するためのおまじない。
後、おまけとしてダウンロード完了までの時間を表示させるにはContent-Lengthでファイルサイズを送ってあげると親切なのかもしれません。
まぁ、しかし、これでPDFも正常にダウンロードできるようになりました。でめたしでめたし。