あるxlsファイルをダウンロードさせようと
$filename = 'attachment; filename="Download.xls"';みたいに書いた。
$resp = $this->getResponse();
$resp->setHeader('Content-Type', 'application/vnd.ms-excel');
$resp->setHeader('Content-Disposition', $filename);
$resp->appendBody(file_get_contents($filepath));
$resp->sendResponse();
動かしてみたら問題なく動いた。
と思ったら、他の数人からChromeでアクセスした際に
エラー 349 (net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): 複数の Content-Disposition ヘッダーを受信しました。これは、HTTP レスポンス分割攻撃を防ぐために禁止されています。と出るとの話を聞いた。
自分もChromeなのに別に何も出ない。
一体どう複数なんだいとパケットキャプチャ。
HTTP/1.1 200 OKぐうの音も出ない程に複数。
Date: ■■■■■■■■■■■■
Server: ■■■■■■■■■■■■■
X-Powered-By: PHP/5.3.4
Expires: ■■■■■■■■■■■■■
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Disposition: attachment; filename="Download.xls"
Content-Disposition: attachment; filename="Download.xls"
Connection: close
Transfer-Encoding: chunked
Content-Type: application/vnd.ms-excel
同僚の人からアドバイスをゲット。
第三引数をtrueにして上書きにすればいいのでは、とのこと。
変更してみた。
$resp->setHeader('Content-Disposition', $filename, true);ヘッダが正しく一行だけ出るようになった。
でもソース内で他にContent-Dispositionを設定している所なんかない。
(そもそも上の例でこそファイル名をDownloadで固定にしているが実際はその場で作成している)
なんなの。
ファイル名にカンマが含まれているときに出ました。
返信削除