Подтвердить что ты не робот

Как получить файл csv для загрузки в IE? Работает на firefox

Я борюсь с нечетной ошибкой. У меня есть простое веб-приложение, которое захватывает материал из БД и выводит его как загружаемый файл csv. Он работает на firefox и chrome, но IE не может распознать его как файл csv (думая, что это html fle), и когда я нажимаю save, я получаю сообщение об ошибке: "Не удалось загрузить {имя файла} из {name of site} Невозможно открыть этот интернет-сайт..."

Код:

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

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

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

Это IE8 btw.

Обновление 2: подключение по SSL.

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

target="_blank"

Ответ 4

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

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

Ответ 5

У нас была одна и та же проблема, и после добавления многих заголовков и получения рабочей ссылки я удалил их один за другим и нашел ключ для нас. "Cache-Control: public" поэтому в итоге у нас было

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Пробовали ли вы Content-type: text/csv?

Ответ 9

Некоторое время назад у меня возникла проблема с открытием файлов PDF в IE6 и сбой при установке AdobeReader 6.0 и попытка открыть файл в окне браузера. Чем я нашел этот заголовок:

header('Content-Type: application/force-download');

И он решил проблему, каждый PDF файл был загружен и открыт в Adobe вместо IE.

Ответ 10

Это просто не имеет смысла. Я попробовал принятый ответ, все остальные ответы здесь, и это не сработало для меня. Я попробовал их перестановки, и каким-то образом мне удалось заставить его работать в 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();

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

Ответ 11

После использования 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 Поддержка кросс-браузера

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

Ответ 12

Если вы пытаетесь выполнить эту задачу (получение файла 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 of application/octet-stream --- выполнение text/csv завершается с ошибкой для IE8.