Скачивание файлов в IE6

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

Звучит как хороший повод для развертывания Firefox через групповую политику =)

Mark Glorie 08.09.2008 12:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
1
3 422
10

Ответы 10

У меня была такая же проблема около года назад, и после долгих поисков и исследований мои заголовки (из кода 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.

Dave Jarvis 01.07.2010 12:04

У меня была аналогичная проблема, но она могла быть не совсем связанной. Моя проблема заключалась в том, что IE6, похоже, имеет проблему со специальными символами (в частности, косой чертой) в имени файла. Их удаление устранило проблему.

Если вы используете SSL:

Убедитесь, что вы не включили какие-либо заголовки управления кешем (или заголовки Pragma). В IE6 есть ошибка, которая не позволяет пользователям загружать файлы, если используются заголовки управления кешем. Они получат сообщение об ошибке.

Я выдергивал волосы из-за этого в течение 2 дней, так что, надеюсь, это сообщение кому-то поможет.

Это статья базы знаний: support.microsoft.com/kb/323308/en-us - заголовок должен быть установлен с header('Cache-Control: private'); в IE.

acme 03.11.2011 15:34

просто переключитесь на этот тип контента, и он будет работать, также убедитесь, что в 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.

Надеюсь, это кому-то поможет.

Другие вопросы по теме