IE中的header()问题

时间:2010-10-06 09:35:19

标签: php download http-headers

我有输出文件,图像等的功能:

public function direct($theMimeType, $thePath)
{
    header('Content-type: '.$theMimeType);
    ob_clean(); // clean output buffer
    flush(); // flush output buffer 
    readfile($thePath);
    exit;
}

它在Firefox中运行良好。无论是PDF,DOCX还是任何其他文件,该文件都会打开。然而,在IE中,它会冻结而没有任何显示。

是什么导致这种情况?

编辑:

我添加了其他一些标题:

public function direct($theMimeType, $thePath)
{
    $aSize = filesize($thePath);
    $aBegin = 0;
    $aEnd = $aSize;
    $aFilename = end(explode('/', $thePath));   
    $aTime = date('r', filemtime($thePath));
    $aContentDisposition = ('application/pdf' === $theMimeType) ? 'inline' : 'atachment';
    header('HTTP/1.0 200 OK'); 
    header("Content-Type: $theMimeType");
    header('Cache-Control: public, must-revalidate, max-age=0');
    header('Pragma: no-cache'); 
    header('Accept-Ranges: bytes');
    header('Content-Length:'.($aEnd-$aBegin));
    header("Content-Range: bytes $aBegin-$aEnd/$aSize");
    header("Content-Disposition: $aContentDisposition; filename=$aFilename");
    header("Content-Transfer-Encoding: binary\n");
    header("Last-Modified: $aTime");
    header('Connection: close');
    ob_clean(); // clean output buffer
    flush(); // flush output buffer 
    readfile($thePath);
    exit;
}

嗯,它现在可以在IE中运行,但它仍然比Firefox更慢地打开文件。在IE浏览器打开文件之前似乎有几秒钟冻结。

2 个答案:

答案 0 :(得分:2)

  • 直接下载此文件,而不是使用任何脚本
  • 确保它适用于IE
  • 在firefox中,使用LiveHTTPHeaders观看web-server发送的标题
  • 在firefox中,使用LiveHTTPHeaders来查看脚本发送的标题
  • 使您的脚本标题与Web服务器的标题相同

答案 1 :(得分:1)

大部分标题都不是必需的。我更喜欢保持简单:

header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public');
header ('Content-Type: '.$theMimeType);
header ('Content-Disposition: '.$aContentDisposition.'; filename="'.$aFilename.'"');
header ('Content-Transfer-Encoding: binary');
header ('Content-Length: '.$aSize);

注意Content-Transfer-Encoding标头末尾的\ n。

'Pragma:public'是专门用于处理IE和https连接问题的工作区。另一个关键区别是引号中的$ aFilename。