1

我正在使用 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

我已经查看了有关该主题的几篇文章,并尝试了更多不同的标题组合,我什至无法计算。是否有更安全的方法来处理不会导致旧浏览器出现问题的此功能?

谢谢!

4

3 回答 3

3

我以前曾与此斗争过,我认为它源于缓存标头。

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

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

Microsoft 的这篇文章进一步讨论了缓存标头。

这是我过去为使其正常工作所做的工作:

$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()
于 2012-12-14T18:39:02.917 回答
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");

我总是被这个抓住!:(

于 2013-01-22T16:19:42.240 回答
0

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

感谢您对 kulishch 的所有投入,您也来自明尼苏达州,这太讽刺了!?节日快乐!

——尼古拉斯

于 2012-12-17T20:22:03.347 回答