私は奇妙なエラーで苦労しています。 DBからデータを取得し、ダウンロード可能なcsvファイルとして出力する単純なWebアプリがあります。これはFirefoxとChromeで動作しますが、IEはそれをcsvファイルとして認識できず(htmlファイルであると考えます)、[保存]をクリックすると、「{名前をダウンロードできません{ファイル名} from {サイト名}。このインターネットサイトを開けません。.. "
コード:
session_start();
//some logic goes here...
//generate csv header
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=exportevent.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo "Event: " . $event_title . "\n";
//print the column names
echo "Last Name, First Name, Company \n";
while($row = mysql_fetch_assoc($result))
{
echo $row['atlname'] . ',' . $row['atfname'] . ',' . $row['atcompany'] . "\n";
}
私はcontent-typeを丸ごといじってみましたが、効果はありませんでした。
更新:私はtext/csv、application/vnd.ms-Excel(およびそのバリエーション)、text/plain、および運が悪くて忘れてしまった他のいくつかを試しました。
これはIE8です。
更新2:接続はSSL経由です。
IEは好きではありませんか? :)
それらのヘッダーを使用してみてください:
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"exportevent.csv\";" );
header("Content-Transfer-Encoding: binary");
オクテットストリームのコンテンツタイプではIE=がファイルのダウンロードを強制していると思います。
私たちは最近この問題に自分で遭遇しました。これを見てください MSKB記事
これらは、SSLを介して機能させるために使用する必要があるヘッダーです。
header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$file_name\";");
header("Content-length: " . strlen($csv_string));
私は以下で成功しました:
header("Content-type: application/vnd.ms-Excel");
header("Content-disposition: attachment; filename=File.csv");
タイプをapplication/vnd.ms-Excelに設定すると、私の場合はうまくいくようです。これはすべて、以下を使用してフォームを送信することによって開かれるファイルにあります
target="_blank"
SSLを使用するためにIEに追加する必要があった追加コードは次のとおりです:header("Pragma: public");
したがって、ヘッダーは次のようになります。
header("Pragma: public");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=some_filename.csv");
同じ問題が発生しました。多くのヘッダーを追加して機能するリンクを取得した後、それらを1つずつ削除して、重要なのは "Cache-Control:public"であることがわかりました。
header("Cache-Control: public");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=some_filename.csv");
うまくいきました。
コンテンツタイプをtext/csv
ではなくapplication/octet-stream
に設定してみてください。
Application/octet-streamは一般的なバイナリMIMEタイプであるため(「.csv」拡張子と一致しません)、Internet Explorerはそれを無視し、ファイル拡張子に基づいてMIMEタイプを計算する場合があります。
私のための解決策は:
header_remove();
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=brokerlist.csv');
echo $content;