Я борюсь с нечетной ошибкой. У меня есть простое веб-приложение, которое захватывает материал из БД и выводит его как загружаемый файл 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.
Разве мы не любим ИЭ? 🙂
Попробуйте использовать те заголовки:
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 MYH: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"
Единственным дополнительным кодом, который я должен был добавить для IE для работы с SSL, был: header("Pragma: public");
Итак, мои заголовки выглядят так:
header("Pragma: public"); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=some_filename.csv");
У нас была одна и та же проблема, и после добавления многих заголовков и получения рабочей ссылки я затем удалил их один за другим и нашел ключ для нас: «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;
Вы пробовали Content-type: text / csv?
Некоторое время назад у меня возникла проблема с открытием PDF-файлов IE6 и сбоем при установке AdobeReader 6.0 и попыткой открыть файл в окне браузера. Чем я нашел этот заголовок:
header('Content-Type: application/force-download');
И он решил проблему, каждый PDF-файл был загружен и открыт в Adobe вместо IE.
Это просто не имеет смысла. Я попробовал принятый ответ, все остальные ответы здесь, и это не сработало для меня. Я попробовал их перестановки, и каким-то образом мне удалось заставить его работать в 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();
Одна вещь, которую я сделал, – это очистить кеш за каждое свободное время, которое я тестирую. И это все еще не имеет смысла. На всякий случай кому-то может понадобиться это отчаянно;)
После использования 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 Поддержка кросс-браузера
Надеюсь, это будет полезно для вас.
Если вы пытаетесь выполнить эту задачу (получение файла CSV для загрузки в IE8) с помощью Salesforce.com (в этом случае ваш front-end – 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.