web-dev-qa-db-ja.com

IEでcsvファイルをダウンロードするにはどうすればよいですか? Firefoxで動作します

私は奇妙なエラーで苦労しています。 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経由です。

34
tau-neutrino

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=がファイルのダウンロードを強制していると思います。

56
Caissy

私たちは最近この問題に自分で遭遇しました。これを見てください 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));
6
jasonbar

私は以下で成功しました:

header("Content-type: application/vnd.ms-Excel");
header("Content-disposition: attachment; filename=File.csv");

タイプをapplication/vnd.ms-Excelに設定すると、私の場合はうまくいくようです。これはすべて、以下を使用してフォームを送信することによって開かれるファイルにあります

target="_blank"
4
Jason

SSLを使用するためにIEに追加する必要があった追加コードは次のとおりです:header("Pragma: public");したがって、ヘッダーは次のようになります。

 header("Pragma: public");  
 header("Content-Type: application/octet-stream");
 header("Content-Disposition: attachment; filename=some_filename.csv");
4
Randoogle

同じ問題が発生しました。多くのヘッダーを追加して機能するリンクを取得した後、それらを1つずつ削除して、重要なのは "Cache-Control:public"であることがわかりました。

header("Cache-Control: public"); 
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=some_filename.csv");

うまくいきました。

2
davidu

コンテンツタイプをtext/csvではなくapplication/octet-streamに設定してみてください。

Application/octet-streamは一般的なバイナリMIMEタイプであるため(「.csv」拡張子と一致しません)、Internet Explorerはそれを無視し、ファイル拡張子に基づいてMIMEタイプを計算する場合があります。

1
Seth

私のための解決策は:

header_remove(); 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename=brokerlist.csv'); 
echo $content;
0
Frankos