使用ajax请求下载文件

我想发送一个“ajax下载请求”,当我点击一个button,所以我试图这样:

JavaScript的:

var xhr = new XMLHttpRequest(); xhr.open("GET", "download.php"); xhr.send(); 

的download.php:

 <? header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename= file.txt"); header("Content-Transfer-Encoding: binary"); readfile("file.txt"); ?> 

但不能按预期工作,我该怎么办? 先谢谢你

2015年4月27日更新

上传到HTML5场景的是下载属性 。 它在Firefox和Chrome中得到了支持 ,并且即将推出到IE11。 根据您的需要,只要您要下载的文件与您的网站位于相同的原始位置,就可以使用它而不是AJAX请求(或使用window.location )。

通过使用一些JavaScript来testingdownload是否受支持,如果不支持,可以使AJAX请求/ window.location回退,如果不支持,则将其切换到调用window.location

原始答案

你不能有一个AJAX请求打开下载提示,因为你物理上必须导航到文件提示下载。 相反,您可以使用成功function导航到download.php。 这将打开下载提示,但不会更改当前页面。

 $.ajax({ url: 'download.php', type: 'POST', success: function() { window.location = 'download.php'; } }); 

即使这回答了这个问题,最好只使用window.location并完全避免AJAX请求。

你其实并不需要Ajax。 如果您只是将“download.php”设置为button上的href,或者如果它不是链接使用:

 window.location = 'download.php'; 

浏览器应该识别二进制下载并且不加载实际的页面,而只是作为下载来提供文件。

有可能的。 您可以从ajax函数内开始下载,例如,在.csv文件创build之后。

我有一个ajax函数,将联系人数据库导出到.csv文件,并且在完成之后,它会自动启动.csv文件下载。 所以,当我得到responseText和一切正常后,我redirect浏览器像这样:

 window.location="download.php?filename=export.csv"; 

我的download.php文件如下所示:

 <?php $file = $_GET['filename']; header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=".$file.""); header("Content-Transfer-Encoding: binary"); header("Content-Type: binary/octet-stream"); readfile($file); ?> 

没有任何页面刷新,文件自动开始下载。

– 在以下浏览器中进行testing:

 Chrome v37.0.2062.120 Firefox v32.0.1 Opera v12.17 Internet Explorer v11 

为了让浏览器下载一个文件,你需要这样做:

  function downloadFile(urlToSend) { var req = new XMLHttpRequest(); req.open("GET", urlToSend, true); req.responseType = "blob"; req.onload = function (event) { var blob = req.response; var fileName = req.getResponseHeader("fileName") //if you have the fileName header available var link=document.createElement('a'); link.href=window.URL.createObjectURL(blob); link.download=fileName; link.click(); }; req.send(); } 

我更喜欢Location.assign()

developer.mozilla.org/en-US/docs/Web/API/Location.assign

从头文件解码一个文件名是有点复杂…

 var filename = "default.pdf"; var disposition = req.getResponseHeader('Content-Disposition'); if (disposition && disposition.indexOf('attachment') !== -1) { var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; var matches = filenameRegex.exec(disposition); if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, ''); 

}