这是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脚本正在运行并且正在被调用。
答案 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,那么该按钮将毫无用处,但链接可以正常工作。)