-1

我正在研究允许用户使用 php 下载 pptx 和 zip 文件的脚本,但是这个脚本在不同的浏览器上表现不同。我尝试了互联网上的许多脚本,但没有一个能正常工作,所以我做了这个,从不同的脚本中收集块。

  1. firefox => 完美运行
  2. Opera => 将文件下载为 HTM 文件
  3. Safari => 0kb 文件
  4. IE => 捕获旧文件

我的代码:-

// content type for pptx file 
$ctype = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
$file = "http://www.abc.com/presentation.pptx";
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: ".$ctype); 
header("Content-Disposition: attachment; filename=\"".basename($file)."\";" ); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($file)); 

ob_clean(); 
flush(); 
readfile( $file);

如何让所有浏览器可靠地下载文件,而不是显示上面看似随机的行为?

编辑:下面是对我有用的代码,我不确定问题是什么,不需要的标题或文件路径?我做了两个改变并且它起作用了。

$ctype = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
$file = "Presentation3.pptx";
header("Pragma: public"); 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: ".$ctype); 
header("Content-Disposition: attachment; filename=\"".basename($file)."\";" ); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($file)); 
readfile( $file); 
4

3 回答 3

1

在我对您的代码的测试中,如果使用本地文件而不是带有 url 的 url 也可以给我 0kb

我在 Firefox、IE、Chrome 中测试所有结果都是一样的

  // content type for pptx file 
    $ctype = "application/vnd.openxmlformats-officedocument.presentationml.presentation";

    $file = "presentation.pptx";//attention  

    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); // required for certain browsers 
    header("Content-Type: ".$ctype); 
    header("Content-Disposition: attachment; filename=\"".basename($file)."\";" ); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: ".filesize($file)); 

    ob_clean(); 
    flush(); 
    readfile( $file); 
于 2013-04-16T19:55:56.023 回答
1

请注意,IOS 浏览器下载存在一些问题。

于 2013-04-16T20:35:04.457 回答
1

如果文件在您的服务器中,请不要使用 URL。如果它是外部文件,我会先将其写入您的服务器,然后将其打印给用户。

我也会删除该header("Cache-Control: private",false);行;并使用header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');而不是header("Expires: 0");. 它总是以这种方式对我有用:)

还可以尝试删除ob_clean(); flush();(因为在发送文件之前没有任何东西要刷新或清理)。

于 2013-04-16T20:07:22.593 回答