我有一个链接,当点击请求 download.php 时,该文件将发布标题并开始下载文件。我还有一个名为 download_count 的函数,在单击链接时执行(通过onclick)并启动AJAX请求。 AJAX请求执行一个名为fetch.php的文件。
<a href="https://site.com/download.php?id=1" onclick="download_count();">Click to Download</a>
如果AJAX请求是异步的,则fetch.php永远不会响应(Firebug表示它正在加载)。弹出“保存文件”对话框,可以下载文件,但不需要AJAX调用的额外内容。
以下是download.php发送的标题:
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="blah.rar");
header("Content-Transfer-Encoding: binary");
如果AJAX请求是同步的,fetch.php会返回一个结果,一切都很好。我的javascript能够使用fetch.php返回的结果在弹出“保存文件”对话框之前对页面HTML进行一些更改。
我猜我的问题与download.cp发送一些标头以启动文件下载这一事实有关,而download_count()正在尝试执行AJAX请求。我真的不明白为什么这是一个问题。
有人可以澄清为什么同步AJAX在这种情况下工作而异步不工作?有没有办法让异步调用工作,同时仍然允许通过请求download.php来下载文件?
答案 0 :(得分:1)
下载文件会导航浏览器远离当前页面。因此,浏览器将取消任何和所有活动的AJAX连接。解决方案是将文件下载放在AJAX调用的成功块中。这样它就不必是同步的,但是你的AJAX调用将保证完成。
成功块中的文件下载可能如下所示:
function download_count(url) {
$.ajax({
url: "fetch.php",
success: function() {
window.location = url;
}
});
return false;
}
return false
将阻止超链接。然后你的HTML将是:
<a href="https://site.com/download.php?id=1" onclick="return download_count(this.href);">Click to Download</a>