在IE7 / 8中提供PDF文件下载失败

时间:2012-12-14 18:06:05

标签: php internet-explorer zend-framework http-headers file-handling

我正在使用Zend并且在webroot之外有一些我希望能够提供的文件。我尝试了两种方法,这两种方法都适用于除IE 8或更低版本之外的所有浏览器。

我尝试过的两种(工作)方法如下:

  // Approach #1
  header('Content-Type: application/pdf');
  header("Pragma: ");
  header("Content-Disposition: attachment; filename=\"$filename\"");
  //header('Content-Transfer-Encoding: binary');
  header("Pragma: no-cache");
  header("Expires: 0");
  readfile($file);      

  // Approach #2
  $this->getResponse()
   ->setHeader('Content-Disposition', "attachment; filename=$filename")
  ->setHeader('Content-type', 'application/x-pdf');
  fpassthru($file);

就像我说的,这两种方法都适用于现代浏览器(甚至IE9),但不适用于旧版IE。我得到的错误如下:http://cl.ly/image/1G3x370b1s09

我已经查看了有关此主题的几篇帖子,并尝试了更多不同的标题组合,而不是我甚至可以计算。是否有一种更加防弹的方式来处理这种不会导致旧浏览器出现问题的功能?

谢谢!

3 个答案:

答案 0 :(得分:3)

之前我曾与之斗争,我认为它源于缓存标题。

有三个:ExpiresCache-Control(HTTP 1.1)和Pragma(HTTP 1.0)。我的经验是IE的旧版本喜欢看到所有这三个标题。在您发送的任何其他标题和内容之前尝试使用以下内容:

header("Cache-control: no-cache");
header("Pragma: no-cache");
header("Expires: -1");

Microsoft的这个article会进一步讨论缓存标题。

这是我过去所做的工作:

$file = $fileInfo->openFile('r');
header("Pragma: public");
header("Cache-Control: public");
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$file->getFilename().'"');
print $file->fpassthru()

答案 1 :(得分:0)

违背我的意愿,我放弃了尝试与标题斗争,彻底改变了我处理文件下载的方式。当用户现在请求文件时,它被临时散列,复制到web服务器可以看到的区域,用户重定向到该文件,一旦他们离开下载区域,文件就被删除。如果它们变为非活动状态,则会以设定的间隔自动删除该文件。

感谢所有输入kulishch以及你来自明尼苏达州的讽刺意味!节日快乐!

- 尼古拉斯

答案 2 :(得分:0)

http://support.microsoft.com/default.aspx?scid=KB;EN-US;q316431&处提出建议,这些标题对我有用:

header("Cache-control: max-age=3600, must-revalidate");
header("Pragma: public");
header("Expires: -1");

我总是被这个抓住了! :(