Я столкнулся с довольно интересной (и разочаровывающей) проблемой с IE6. Мы обслуживаем некоторые pdf-файлы, сгенерированные сервером, а затем просто устанавливаем заголовки в PHP для принудительной загрузки файла браузером. Работает нормально и все, кроме IE6, но Только, если учетная запись пользователя Windows установлена на стандартный пользователь (т.е. не администратор).
Поскольку это для корпоративной среды, конечно, все их учетные записи настроены таким образом. Странно то, что в диалоговом окне загрузки Content-Type не распознается:
header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );
header( 'Content-Description: File Transfer' );
header( 'Content-Type: application/pdf' );
header( 'Content-Disposition: attachment; filename = "xxx.pdf"' );
header( 'Content-Transfer-Encoding: binary' );
echo $content;
exit;
Я также попытался сначала записать содержимое файла во временный файл, чтобы я мог также установить Content-Length в заголовке, но это не помогло.






У меня была такая же проблема около года назад, и после долгих поисков и исследований мои заголовки (из кода Java) ищут IE6 и PDF-файлы следующим образом:
response.setHeader("Content-Type", "application/pdf "; name = " + file.getName());
response.setContentType("application/pdf");
response.setHeader("Last-Modified", getHeaderDate(file.getFile());
response.setHeader("Content-Length", file.getLength());
Отбрось все остальное.
Очевидно, есть что-то странное с IE6, кешированием, принудительной загрузкой и надстройками. Надеюсь, это сработает для вас ... небольшая разница для меня в том, что запрос изначально исходит из файла Flash swf. Но это не имеет значения.
некоторые версии IE, похоже, принимают
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
слишком серьезно и удалите загруженный контент, прежде чем он будет передан плагину для его отображения.
Удалите эти два, и все будет в порядке.
И убедитесь, что вы не используете какое-либо сжатие GZIP на стороне сервера при работе с PDF-файлами, потому что некоторые версии Acrobat, похоже, борются с этим.
Я знаю, что здесь я расплывчатый, но приведенные выше советы основаны на реальном опыте, который я получил при использовании веб-приложения, обслуживающего динамически создаваемые PDF-файлы, содержащие штрих-коды. Я не знаю, какие версии затронуты, я знаю только, что использование двух "уловок" выше привело к прекращению обращений в службу поддержки: p
Как уже упоминал пилиф, обязательно отключите сжатие gzip на стороне сервера. Для меня это вызвало проблемы с файлами PDF (среди других типов) и, возможно, по непонятным причинам, также с файлами .zip как в Internet Explorer, так и в FireFox.
Насколько я мог судить, последний бит нижнего колонтитула zip будет удален (по крайней мере, FireFox), что приведет к повреждению формата.
В PHP вы можете использовать следующий код:
ini_set("zlib.output_compression",0);
У меня работает следующий фрагмент кода Java (протестирован в Firefox 2 и 3, IE 6 и 7):
response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
response.setContentType(getServletContext().getMimeType(file.getName()));
response.setContentLength(file.length());
Никаких других заголовков не требовалось. Кроме того, я тестировал этот код как с включенным, так и с отключенным сжатием gzip (с использованием отдельного фильтра сервлета, который выполняет сжатие). Нет никакой разницы (работает без проблем в четырех браузерах, в которых я тестировал). Кроме того, это работает и для других типов файлов.
Вы можете добавить дополнительный параметр, который сервер не будет читать в URL-адрес, это тоже может помочь.
http://www.mycom.com/services/pdf?action=blahblah&filename=pdf0001.pdf
Я сталкивался со случаями, когда то есть с большей вероятностью будет читать имя файла в конце URL-адреса, чем любой из заголовков
Content-Transfer-Encoding: binary
Этот заголовок копируется из заголовков электронной почты. Это не относится к HTTP просто потому, что HTTP не имеет другого режима передачи, кроме двоичного. Его установка имеет такой же смысл, как и установка X-Bits-Per-Byte: 8.
Cache-control: pre-check=0, post-check=0
Эти нестандартные значения определяют, когда IE должен проверять, свежий ли кэшированный контент. По умолчанию используется 0, поэтому установка 0 - пустая трата времени. Эти директивы применяются только к кэшируемому контенту, а Expires:0 и must-revalidate намекают, что вы хотите сделать его некэшируемым.
Content-Description: File Transfer
Это еще один подражатель электронной почты. По дизайну это заголовок никак не влияет на загрузку. Это просто информативный текст произвольной формы. Технически он так же полезен, как заголовок X-Hi-Mom: I'm sending you a file!.
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );
В PHP вторая строка полностью перезаписывает первая. Кажется, ты колешь в темноте.
Content-Disposition: attachment
Вам не нужно вставлять туда имя файла (вы можете использовать трюк mod_rewrite или index.php/fakefilename.doc - он намного лучше поддерживает специальные символы и работает в браузерах, которые игнорируют заголовок необязательныйContent-Disposition).
В IE имеет значение, находится ли файл в кеше или нет («Открыть» не работает для некэшируемых файлов) и есть ли у пользователя подключаемый модуль, который утверждает, что поддерживает тип файла, который обнаруживает IE.
Чтобы отключить кеш, вам нужен только Cache-control:no-cache (без 20 дополнительных поддельных заголовков), а чтобы сделать файл кешируемым, вам не нужно ничего отправлять.
NB: PHP имеет ужасную ошибку под названием session.cache_limiter, которая безнадежно портит заголовки HTTP, если вы не установите его на none.
ini_set('session.cache_limiter','none'); // tell PHP to stop screwing up HTTP
В Kubuntu по умолчанию для Apache / php5 установлен session.cache_limiter = nocache.
У меня была аналогичная проблема, но она могла быть не совсем связанной. Моя проблема заключалась в том, что IE6, похоже, имеет проблему со специальными символами (в частности, косой чертой) в имени файла. Их удаление устранило проблему.
Если вы используете SSL:
Убедитесь, что вы не включили какие-либо заголовки управления кешем (или заголовки Pragma). В IE6 есть ошибка, которая не позволяет пользователям загружать файлы, если используются заголовки управления кешем. Они получат сообщение об ошибке.
Я выдергивал волосы из-за этого в течение 2 дней, так что, надеюсь, это сообщение кому-то поможет.
Это статья базы знаний: support.microsoft.com/kb/323308/en-us - заголовок должен быть установлен с header('Cache-Control: private'); в IE.
просто переключитесь на этот тип контента, и он будет работать, также убедитесь, что в Pragma установлено значение, НЕ равное "no-cache"
header( 'Content-type: application/octet-stream'); # force download, no matter what mimetype
header( 'Content-Transfer-Encoding: binary' ); # is always ok, also for plain text
Я ценю время, которое вы, ребята, потратили на этот пост. Я попробовал несколько комбинаций и наконец заставил мой проект symfony заработать. Здесь я публикую решения на случай, если у кого-то возникнет такая же проблема:
public function download(sfResponse $response) {
$response->clearHttpHeaders();
$response->setHttpHeader('Pragma: public', true);
$response->addCacheControlHttpHeader("Cache-control","private");
$response->setContentType('application/octet-stream', true);
$response->setHttpHeader('Content-Length', filesize(sfConfig::get('sf_web_dir') . sfConfig::get('app_paths_docPdf') . $this->getFilename()), true);
$response->setHttpHeader("Content-Disposition", "attachment; filename=\"". $this->getFilename() ."\"");
$response->setHttpHeader('Content-Transfer-Encoding', 'binary', true);
$response->setHttpHeader("Content-Description","File Transfer");
$response->sendHttpHeaders();
$response->setContent(readfile(sfConfig::get('sf_web_dir') . sfConfig::get('app_paths_docPdf') . $this->getFilename()));
return sfView::NONE;
}
У меня это отлично работает в IE6, IE7, Chrome, Firefox.
Надеюсь, это кому-то поможет.
Звучит как хороший повод для развертывания Firefox через групповую политику =)