如何在所有浏览器中强制下载文件?

时间:2013-04-16 19:32:52

标签: php

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

  1. firefox =>完美无缺
  2. Opera =>将文件下载为HTM文件
  3. Safari => 0kb文件
  4. IE =>抓取旧文件
  5. 我的代码: -

    // 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); 
    

3 个答案:

答案 0 :(得分: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); 

答案 1 :(得分:1)

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

我也会删除header("Cache-Control: private",false);行;并使用header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');代替header("Expires: 0");。它总是这样对我有用:)

同时尝试删除ob_clean(); flush();(因为在发送文件之前无需刷新或清除)。

答案 2 :(得分:1)

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