代码之家  ›  专栏  ›  技术社区  ›  Alex Weinstein

PHP:再次强制文件下载和IE

  •  9
  • Alex Weinstein  · 技术社区  · 15 年前

    伙计们,我知道有很多关于强制弹出下载对话框的帖子,但是没有一个解决方案适合我。

    我的应用程序向用户的电子邮件帐户发送邮件,通知他们“其他用户向他们发送了一条消息”。这些邮件可能有指向Excel文件的链接。当用户点击GMail/Yahoo Mail/Outlook中指向Excel文件的链接时,我希望弹出文件保存对话框。

    问题:当我右键单击并在IE上执行“另存为”时,会出现一个“另存为”对话框。当我点击链接时(我的许多客户都会这样做,因为他们不懂电脑),我会收到一条IE错误消息:“IE无法下载文件…从…”。可能是相关的:在我测试这个的GMail上,每个链接都是一个“target=\u blank”链接(由谷歌强制)。

    HTTP/1.1 200 OK
    Proxy-Connection: Keep-Alive
    Connection: Keep-Alive
    Content-Length: 15872
    Via: **** // proxy server name
    Expires: 0
    Date: Tue, 20 Oct 2009 22:41:37 GMT
    Content-Type: application/vnd.ms-excel
    Server: Apache/2.2.11 (Unix) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i mod_python/3.3.1 Python/2.5.2 SVN/1.4.6 mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
    Cache-Control: private
    Pragma: no-cache
    Last-Modified: Tue, 20 Oct 2009 22:41:37 GMT
    Content-Disposition: attachment; filename="myFile.xls"
    Vary: Accept-Encoding
    Keep-Alive: timeout=5, max=100
    

    我想让IE正常的左键点击行为起作用。有什么想法吗?

    4 回复  |  直到 12 年前
        1
  •  15
  •   Chuck Le Butt    10 年前

    这将检查IE的版本并相应地设置标题。

    // assume you have a full path to file stored in $filename
    if (!is_file($filename)) {
      die('The file appears to be invalid.');
    }
    
    $filepath = str_replace('\\', '/', realpath($filename));
    $filesize = filesize($filepath);
    $filename = substr(strrchr('/'.$filepath, '/'), 1);
    $extension = strtolower(substr(strrchr($filepath, '.'), 1));
    
    // use this unless you want to find the mime type based on extension
    $mime = array('application/octet-stream');
    
    header('Content-Type: '.$mime);
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: '.sprintf('%d', $filesize));
    header('Expires: 0');
    
    // check for IE only headers
    if (preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']) || (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false)) {
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
      header('Pragma: public');
    } else {
      header('Pragma: no-cache');
    }
    
    $handle = fopen($filepath, 'rb');
    fpassthru($handle);
    fclose($handle);
    
        2
  •  6
  •   Buzogany Laszlo    11 年前

    只需使用:

    header('Content-Disposition: attachment');
    

    这就是全部。(Facebook也是如此。)

        3
  •  2
  •   Trevor    10 年前

    如果每次都试图下载文件,请将内容类型更改为“应用程序/八位字节流”。

    请尝试不使用pragma语句。