单击按钮下载文件

时间:2013-10-09 16:52:58

标签: php jquery

这是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脚本正在运行并且正在被调用。

1 个答案:

答案 0 :(得分:3)

不要使用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,那么该按钮将毫无用处,但链接可以正常工作。)