Загрузка файла в IE6 получает неправильное имя файла

У меня есть PHP-скрипт, который обрабатывается через https: //, который пытается вытолкнуть PDF-файл пользователю. Проблема, которую в Internet Explorer 6 (к сожалению, мне все еще нужно поддерживать), не подчиняется имени файла, установленному в заголовке. FireFox и IE7 работают нормально.

Имя файла продолжает выдаваться как случайное имя с правильным расширением. Пример: «CAOTC5K3.pdf», «CAXSIPXV.pdf» или «CA1OCVTX.pdf»

Если я не комментирую строку «Тип контента», IE6 дает мне ошибку и пытается загрузить файл inline с именем строки запроса, которая была передана PHP.

<?php //header( "Content-type: application/pdf" ); $filename = 'quickquote.pdf'; header( "Content-Disposition: attachment;filename=$filename" ); echo file_get_contents( "/example.pdf" ); die; ?> 

Я попытался обернуть имя файла в кавычках, добавив \n в конец строк header , добавив header('Content-type: application/octet-stream'); , добавление header("Content-Type: application/force-download");

Думаю, вам понадобится место после attachment; :

 header("Content-Disposition: attachment; filename=$filename"); 

Если это не сработает, ознакомьтесь с некоторыми из пунктов этой статьи , в том числе:

  • В IE 6.0 все работает в основном, но если вы также настроили Cache-Control: no-cache, ваше предложенное имя файла (и тип!) Будет IGNORED. Облом, если вам нужно выбирать между безопасностью и непринужденностью. Конечно, безопасность выигрывает.
  • Почти во всех версиях IE, включая 6.0, иногда браузер будет использовать имя файла в адресной строке вместо заголовка Content-Disposition Header, а с IE5.5SP2 вы должны изменить раздел реестра UseCDFileName, см. Q303750. Это было исправлено с помощью IE6.0SP1.

EDIT : Вот код, который я использую, напрямую скопированный из источника моего приложения. Дайте мне знать, если это будет работать лучше …

 function forceDownload($filename,$mime=false,$downloadName=false) { if(file_exists($filename) && is_readable($filename)) { if(!$mime) $mime = DFStdLib::determineMimeType($filename); if(!$expire) $expire = DFStdLib::HOUR_IN_SECONDS; if(!$downloadName) $downloadName = basename($filename); header('Last-Modified: '.gmdate('D, d MYH:i:s', filemtime($filename)).' GMT', true, 200); header('Cache-Control: no-cache',true); header('Pragma: Public',true); header('Expires: ' . gmdate('D, d MYH:i:s', time()) . ' GMT',true); header('Content-Length: '.filesize($filename),true); header("Content-Type: {$mime}",true); header("Content-disposition: attachment; filename=$downloadName",true); readfile($filename); exit(); } else { header('HTTP/1.1 404 Not Found',true,404); echo "<html><head><title>Not Found</title></head><body>The file was not found.</body></html>"; exit(); } } 

Использование для вашего дела будет:

 forceDownload('/example.pdf','application/pdf','quickquote.pdf'); 

Также вам нужно будет изменить DFStdLib::HOUR_IN_SECONDS на 3600 и написать собственную функцию DFStdLib::HOUR_IN_SECONDS или удалить эту строку и сделать аргумент $mime необходимым …

Вы можете использовать следующий Content-Type, чтобы заставить IE использовать заголовок Content-Disposition.

(Работайте в IE7, когда вы решите «открыть» файл)

 Content-Type: application/save 

ср http://blog.mjjames.co.uk/2009/04/content-disposition-in-different.html