首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ajax请求下载文件

使用ajax请求下载文件
EN

Stack Overflow用户
提问于 2013-12-30 05:35:10
回答 9查看 359.8K关注 0票数 109

当我点击一个按钮时,我想发送一个"ajax下载请求“,所以我尝试这样做:

javascript:

代码语言:javascript
复制
var xhr = new XMLHttpRequest();
xhr.open("GET", "download.php");
xhr.send();

download.php:

代码语言:javascript
复制
<?
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename= file.txt");
header("Content-Transfer-Encoding: binary");    
readfile("file.txt");
?>

但是没有像预期的那样工作,我该怎么做?提前谢谢你

EN

回答 9

Stack Overflow用户

发布于 2017-03-16 00:49:47

要让浏览器下载文件,您需要发出如下请求:

代码语言:javascript
复制
 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();
 }
票数 54
EN

Stack Overflow用户

发布于 2013-12-30 05:46:48

为此,您实际上根本不需要ajax。如果您只是将"download.php“设置为按钮上的href,或者,如果它不是一个链接,请使用:

代码语言:javascript
复制
window.location = 'download.php';

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

票数 48
EN

Stack Overflow用户

发布于 2018-04-05 22:05:08

跨浏览器解决方案,在Chrome,Firefox,Edge,IE11上测试。

在DOM中,添加一个隐藏的链接标记:

代码语言:javascript
复制
<a id="target" style="display: none"></a>

然后:

代码语言:javascript
复制
var req = new XMLHttpRequest();
req.open("GET", downloadUrl, true);
req.responseType = "blob";
req.setRequestHeader('my-custom-header', 'custom-value'); // adding some headers (if needed)

req.onload = function (event) {
  var blob = req.response;
  var fileName = null;
  var contentType = req.getResponseHeader("content-type");

  // IE/EDGE seems not returning some response header
  if (req.getResponseHeader("content-disposition")) {
    var contentDisposition = req.getResponseHeader("content-disposition");
    fileName = contentDisposition.substring(contentDisposition.indexOf("=")+1);
  } else {
    fileName = "unnamed." + contentType.substring(contentType.indexOf("/")+1);
  }

  if (window.navigator.msSaveOrOpenBlob) {
    // Internet Explorer
    window.navigator.msSaveOrOpenBlob(new Blob([blob], {type: contentType}), fileName);
  } else {
    var el = document.getElementById("target");
    el.href = window.URL.createObjectURL(blob);
    el.download = fileName;
    el.click();
  }
};
req.send();
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20830309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档