Файл загрузки в IE6 получает неправильное имя файла - PullRequest
5 голосов
/ 20 мая 2010

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

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

Если я откомментирую строку «Content-type», IE6 выдаст мне ошибку и попытается загрузить встроенный файл с именем строки запроса, которая была передана в 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 ]

8 голосов
/ 20 мая 2010

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

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

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

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

РЕДАКТИРОВАТЬ : Вот код, который я использую, непосредственно скопированный из источника моего приложения. Дайте мне знать, если это работает лучше ...

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 голосов
/ 07 марта 2013

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

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

Content-Type: application/save

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...