Как получить файл 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.
Ответы
Ответ 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.