IE6中的文件下载文件名错误

时间:2010-05-19 20:03:43

标签: php pdf download internet-explorer-6

我有一个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 个答案:

答案 0 :(得分:8)

认为您可能需要attachment;之后的空格:

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

如果不工作,检查出一些点的this article,包括:

  • 在IE 6.0,东西大多是工作,但如果你还设置缓存控制:无缓存,您建议的文件名(!和类型)将被忽略。如果你必须在安全和便利之间做出选择,那就太糟糕了。当然,安全获胜。
  • 在几乎所有版本的IE,包括6.0,有时浏览器将使用在地址栏,而不是内容处理标头名,并与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参数... < / p>

答案 1 :(得分:0)

您可以使用以下Content-Type强制IE使用Content-Disposition标头。

(当您选择'打开'文件时,在IE7中工作)

Content-Type: application/save

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