Как мне получить CSV-файл для загрузки на IE? Работает на Firefox - PullRequest
34 голосов
/ 09 февраля 2010

Я борюсь со странной ошибкой. У меня есть простое веб-приложение, которое берет данные из БД и выводит их в виде загружаемого CSV-файла. Он работает на Firefox и Chrome, но IE не может распознать его как CSV-файл (думая, что это HTML-файл), и когда я нажимаю сохранить, я получаю сообщение об ошибке: «Невозможно загрузить {имя файла} с {имя сайта} . Невозможно открыть этот интернет-сайт. ... "

Код:

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";      
}

Я играл с типом контента целую кучу, но это не имело никакого эффекта.

Обновление: я пробовал text / csv, application / vnd.ms-excel (и варианты этого), text / plain и некоторые другие, которые я сейчас забываю без удачи.

Это IE8, кстати.

Обновление 2: соединение через SSL.

Ответы [ 12 ]

56 голосов
/ 09 февраля 2010

Разве мы не любим 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 загрузить файл.

6 голосов
/ 24 марта 2010

Мы недавно столкнулись с этой проблемой сами. См. Эту статью 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));
4 голосов
/ 14 января 2011

Единственный дополнительный код, который мне пришлось добавить для IE для работы с SSL, был: header("Pragma: public"); Теперь мои заголовки выглядят так:

 header("Pragma: public");  
 header("Content-Type: application/octet-stream");
 header("Content-Disposition: attachment; filename=some_filename.csv");
4 голосов
/ 10 февраля 2010

У меня был успех со следующим:

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

Задание типа для application / vnd.ms-excel, похоже, помогло в моем случае. Это все в файле, который открывается путем отправки формы с помощью

target="_blank"
2 голосов
/ 06 мая 2011

У нас только что возникла та же проблема, и после добавления множества заголовков и получения рабочей ссылки я удалил их один за другим и нашел для нас ключевой «Кэш-контроль: общедоступный» так что в итоге у нас просто было

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

, который работал нормально.

1 голос
/ 09 февраля 2010

Попробуйте установить тип контента на text/csv вместо application/octet-stream.

Так как application / octet-stream является общим двоичным типом MIME (и не соответствует расширению .csv), Internet Explorer может игнорировать его и вычислять тип MIME на основе расширения файла.

0 голосов
/ 07 декабря 2014

После использования Javascript это решит вашу проблему.

Используйте это для IE,

    var IEwindow = window.open();
    IEwindow.document.write('sep=,\r\n' + CSV);
    IEwindow.document.close();
    IEwindow.document.execCommand('SaveAs', true, fileName + ".csv");
    IEwindow.close();

Для получения дополнительной информации я написал учебник по этому вопросу, см. - Загрузка данных JSON в формате CSV. Кросс-браузерная поддержка

Надеюсь, это будет полезно для вас.

0 голосов
/ 27 октября 2012

Если вы пытаетесь выполнить эту задачу (получение CSV-файла для загрузки в IE8) с помощью Salesforce.com (в этом случае вашим интерфейсом является Visualforce, и вы можетеНе устанавливайте все заголовки, только некоторые из них), вот что вам нужно:

<apex:page cache="true" 
        contentType="application/octet-stream#myAwesomeFileName.csv" 
        showHeader="false" sidebar="false" standardStylesheets="false">
     <apex:outputText value="{!csvContent}" escape="false"/>
</apex:page>

Ключевыми элементами здесь являются cache=true, что в сочетании с атрибутом expires=0 по умолчанию позволяет достичьследующие заголовки:

header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");

А затем contentType из application/octet-stream --- выполнение text/csv завершается неудачно для IE8.

0 голосов
/ 26 сентября 2012

Решение для меня было:

header_remove(); 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename=brokerlist.csv'); 
echo $content;
0 голосов
/ 28 января 2011

Это просто не имеет смысла. Я попробовал принятый ответ, все остальные ответы здесь, и он не работал для меня. Я попробовал их перестановки, и каким-то образом мне удалось заставить его работать в IE примерно так:

 header("Pragma: public");
 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 header("Cache-Control: public");
 header("Content-Type: application/vnd.ms-exce");
 header("Content-Disposition: attachment; filename=coupons.csv" );
 header("Content-Transfer-Encoding: binary");       
 header("Content-Length: " . strlen($csv)); 
 echo $csv;
 die();

Одна вещь, которую я сделал, это очищал кэш каждый раз, когда я проверял код. И это все еще не имеет смысла. На всякий случай кому-то это может понадобиться отчаянно;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...