2010-05-19 3 views
5

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

Имя файла продолжает выдаваться как случайное имя с правильным расширением. Пример: «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");

+2

Есть ли у вас заголовки управления кешем? В частности, нет кэш-памяти или нет? Известно, что они мешают загрузке через https в IE. –

+1

Попытка: header ("Cache-Control: maxage = 1"); header («Pragma: public»); Как это может быть проблема с кешированием. – Gazler

+0

Нет, я не использую заголовки управления кешем.Спасибо Marc – bkulyk

ответ

8

Я думаю вам может понадобиться пробел после attachment;:

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

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

  • В 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 M Y H:i:s', filemtime($filename)).' GMT', true, 200); 
     header('Cache-Control: no-cache',true); 
     header('Pragma: Public',true); 
     header('Expires: ' . gmdate('D, d M Y H: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 и написать свою собственную determineMimeType функцию, или удалите эту строку и сделайте аргумент $mime ...

+0

Я сделал это изменение, однако, оно не устранило мою проблему. Спасибо. – bkulyk

+0

@bkulyk: ОК ... думая о том, как ответить ... вернемся к вам скоро! – Josh

+0

@bkulyk: Я просто вставлял код в прямом виде из приложения, которое работает и используется, и отлично работает. На самом деле это код из стандартной библиотеки PHP моей компании, поэтому он, вероятно, использовался несколько раз. Это вообще помогает? – Josh

Смежные вопросы