Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php IE6中的文件下载获取了错误的文件名_Php_Pdf_Download_Internet Explorer 6 - Fatal编程技术网

Php IE6中的文件下载获取了错误的文件名

Php IE6中的文件下载获取了错误的文件名,php,pdf,download,internet-explorer-6,Php,Pdf,Download,Internet Explorer 6,我有一个通过https://提供的PHP脚本,它试图向用户推送PDF文件。在InternetExplorer6中(不幸的是,我仍然必须支持它)的问题是不遵守头中设置的文件名。FireFox和IE7都工作正常 文件名一直以随机名称显示,扩展名正确。示例:“CAOTC5K3.pdf”、“CAXSIPXV.pdf”或“CA1OCVTX.pdf” 如果我取消注释掉“Content type”行,IE6会给我一个错误,并尝试下载与传递给PHP的查询字符串的名称内联的文件 <?php //header

我有一个通过https://提供的PHP脚本,它试图向用户推送PDF文件。在InternetExplorer6中(不幸的是,我仍然必须支持它)的问题是不遵守头中设置的文件名。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
,添加
标题('Content-type:application/octet-stream'),添加
标题(“内容类型:应用程序/强制下载”)

我想您可能需要在
附件后面留一个空格

header("Content-Disposition: attachment; filename=$filename");
如果这不起作用,请查看中的一些要点,包括:

  • 在IE6.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();
    }
}

此外,您还需要将
DFStdLib::HOUR_IN__SECONDS
更改为
3600
,并编写自己的
determineMetype
函数,或者删除该行并使
$mime
参数成为必需的…

您可以使用以下内容类型强制IE使用内容处理头

(选择“打开”文件时使用IE7)


cf.

您是否有任何正在发布的缓存控制头?特别是没有缓存或没有存储?已知它们会干扰IE中https上的下载。Try:header(“缓存控制:maxage=1”);标题(“Pragma:public”);因为这可能是一个缓存问题。不,我没有使用任何缓存控制头。感谢MarcGazler,这看起来不像是缓存问题,因为每次文件名都是一个新的随机名称。不过,我会试试。@bkulyk:他的意思是,IE6有一个已知的错误,它忽略了
filename=
,如果它收到
缓存控制:无缓存
,我确实做了这个更改,但是,它并没有解决我的问题。非常感谢。@bkulyk:好的。。。思考如何回应。。。快回来@bkulyk:我只是直接从一个正在使用的应用程序中粘贴了一些代码,效果很好。事实上,这是我公司标准PHP库中的代码,所以它可能被使用过很多次。这有帮助吗?它似乎是
标题('Pragma:Public',true)这就成功了。谢谢
forceDownload('/example.pdf','application/pdf','quickquote.pdf');
Content-Type: application/save