【问题标题】:PHP force download not working?PHP强制下载不起作用?
【发布时间】:2011-06-16 03:35:47
【问题描述】:

在我的 HTML 页面上,我向一个应该强制下载的 php 脚本发出了 JQuery ajax 请求,但什么也没发生?

在我的 html 页面上(在链接的单击事件处理程序中)...

var file = "uploads/test.css";
$.ajax(
{
    type      : "POST",
    url       : "utils/Download_File.php",
    data      : {"file":file}
})

Download_File.php 脚本看起来像这样

<?php

Download_File::download();

class Download_File
{
    public static function download()
    {
        $file = $_POST['file'];

        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment');
        readfile('http://localhost/myapp/' . $file);
        exit;
    }
}
?>

但是由于某种原因什么都没有发生?我查看了萤火虫中的响应标头,看不到任何问题。我正在使用 Xampp。非常感谢任何帮助。

谢谢!

【问题讨论】:

  • 这不是它的做法。您需要将location.href 设置为您要下载的文件,或者使用iframe。看看这个问题:

标签: php jquery html ajax


【解决方案1】:

使用document.location.href=URL,而不是ajax..

根据我的经验,ajax 会导致问题(下载不起作用,在浏览器控制台上打印文件内容)。

【讨论】:

    【解决方案2】:

    您应该指定Content-Transfer-Encoding。此外,您应该在Content-Disposition 上指定filename。

    header('Content-Type: application/octet-stream');
    header('Content-Transfer-Encoding: binary');
    header('Content-Disposition: attachment; filename="'.$file.'"');
    readfile('http://localhost/myapp/'.$file);
    exit;
    

    在filename 周围加上双引号很重要,因为RFC 2231 要求这样做。如果 filename 不在引号中,Firefox 会在下载文件名中包含空格的文件时出现问题。

    另外,请检查以确保关闭 ?&gt; 后没有空格。如果 PHP 结束标签后还有一个空格,则标头不会发送到浏览器。

    附带说明,如果您要提供多种常见文件类型供下载,则可以考虑指定这些 MIME 类型。这为最终用户提供了更好的体验。例如,您可以这样做:

    //Handles the MIME type of common files
    $extension = explode('.', $file);
    $extension = $extension[count($extension)-1];
    SWITCH($extension) {
      case 'dmg':
        header('Content-Type: application/octet-stream');
        break;
      case 'exe':
        header('Content-Type: application/exe');
        break;
      case 'pdf':
        header('Content-Type: application/pdf');
        break;
      case 'sit':
        header('Content-Type: application/x-stuffit');
        break;
      case 'zip':
        header('Content-Type: application/zip');
        break;
      default:
        header('Content-Type: application/force-download');
        break;
    }
    

    【讨论】:

    • @Parris 你能分享这方面的任何信息吗?我有一个下载脚本可以做一些类似的事情(使用 cURL 而不是readfile),如果存在潜在问题,我想在我的代码中解决它。 :)
    • 是的,请查看此问题:stackoverflow.com/questions/1218925/… 它会识别问题并尝试解决它。尝试从 https 下载并且您在 http 中也存在问题...
    • "如果文件名不在引号中,Firefox 会在下载文件名中有空格的文件时出现问题。"不仅仅是 Firefox。命令行 wget 工具(适用于 Linux/BSD/OSX)非常敏感,以至于您无法从 VBulletin 论坛软件下载正确的文件名。
    猜你喜欢
    • 2012-08-04
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多