0

这是 HTML:

<button name="download">Download</button>

我希望用户在单击此按钮时下载文件。为此,我使用以下 Ajax 请求:

$parent.find('button[name=download]').click(function () {
    $.ajax({
        url: "download.php",
        sucess: function(data, status, jqXHR){
            $console.text('Download efetuado');
        },
        error:function(xhr, status, error){
            $console.text(xhr.responseText);
        }
    });
});

哪里 download.php 是:

if (file_exists($myFile)){
        header ("Content-Type: application/json");
        header ("Content-Disposition: attachment; filename=$fileName");
        header("Content-Length: " . filesize("$myFile"));
        $fp = fopen("$myFile", "r");
        fpassthru($fp);
    } else {
        echo "no file exists";
    }; 

这没有输出任何内容,也没有下载任何文件。我知道 PHP 脚本正在运行并且正在被调用。

4

1 回答 1

4

不要使用 AJAX 下载文件。并不是它不能发出请求和接收响应,只是它实际上没有任何有意义的方式来处理响应。

另一方面,浏览器本身可以。

因此,您可以将浏览器定向到请求:

$parent.find('button[name=download]').click(function () {
    window.location.href = 'download.php';
});

如果download.php正在发送响应,Content-Disposition: attachment;则不会以任何方式卸载或修改页面。浏览器将完全独立于当前页面上下文来处理此请求的响应,并且在处理完响应之后,页面上下文将保留。

(当然,除非浏览器配置为对该响应执行某些操作,例如始终显示它而不是提示保存它。但是在代码中您无能为力。)

在这一点上,事实上,完全删除 JavaScript 并使其成为普通链接更有意义,这将完成同样的事情:

<a href="download.php">Download</a>

您可以将其设置为看起来像一个按钮,它可能比运行 JavaScript 代码的实际按钮更易于访问。(如果浏览器没有启用 JavaScript,那么按钮将无用,但链接可以正常工作。)

于 2013-10-09T17:01:32.413 回答