Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Ajax或Javascript强制下载文件_Javascript_Jquery_Html_Ajax - Fatal编程技术网

通过Ajax或Javascript强制下载文件

通过Ajax或Javascript强制下载文件,javascript,jquery,html,ajax,Javascript,Jquery,Html,Ajax,所以我有一个列表文件,每个文件的URL作为一个数据属性存储在一个按钮上。单击一个按钮,我想触发一个Javascript/Ajax调用,该调用将在URL处下载文件 现在有一些警告 文件需要通过下载对话框下载,或者需要 正如您所期望的,只需添加到浏览器下载中即可 请求需要能够获取头,因为这是一个跨域请求 这需要在主要浏览器(例如,Chrome、Firefox、Safari)上运行 到目前为止,我已经尝试使用XMLHttpRequest: e.preventDefault(); var csrftok

所以我有一个列表文件,每个文件的URL作为一个数据属性存储在一个按钮上。单击一个按钮,我想触发一个Javascript/Ajax调用,该调用将在URL处下载文件

现在有一些警告

  • 文件需要通过下载对话框下载,或者需要 正如您所期望的,只需添加到浏览器下载中即可
  • 请求需要能够获取头,因为这是一个跨域请求
  • 这需要在主要浏览器(例如,Chrome、Firefox、Safari)上运行
  • 到目前为止,我已经尝试使用XMLHttpRequest:

    e.preventDefault();
    var csrftoken = getCookie('csrftoken');
    var req = new XMLHttpRequest;
    req.open("POST",$(this).data("url"));
    req.setRequestHeader("MY HEADER", "HEADER VALUE;");
    req.withCredentials = true;
    req.send();
    
    我还尝试了Ajax GET请求(不强制下载)和在锚标记(不接受头)上使用下载属性


    谢谢你,不要使用锚定标签,因为锚定标签不兼容跨浏览器(显然,我没有意识到微软在获取HTML5规范方面进展如此之慢。不过这并不出乎意料)

    我们可以利用iframe来避免重定向,并在保持跨浏览器兼容性的同时实现此效果

    <iframe width="1" height="1" frameborder="0" src="[File location]"></iframe>
    
    
    

    只要该文件不是.html或某种可以通过浏览器显示的文件(.htm、.html、.xhtml、.aspx等),它就应该下载该文件。

    而不是使用锚定标记,锚定标记不兼容跨浏览器(显然,我没有意识到微软在获取HTML5规范方面的速度如此之慢。这并非意外)

    我们可以利用iframe来避免重定向,并在保持跨浏览器兼容性的同时实现此效果

    <iframe width="1" height="1" frameborder="0" src="[File location]"></iframe>
    
    
    

    只要文件不是.html或某种可以通过浏览器显示的文件(.htm、.html、.xhtml、.aspx等),它就应该下载文件。

    您必须先捕获url,然后:

    document.location = 'data:Application/octet-stream,' + encodeURIComponent("http://somedomain.com/somefile.some");
    


    这种方法不需要标题。

    您必须先捕获url,然后:

    document.location = 'data:Application/octet-stream,' + encodeURIComponent("http://somedomain.com/somefile.some");
    


    这种方法不需要标题。

    有什么原因不能简单地使用
    ?AJAX完全没有意义。只需使用常规的
    @light:正如我在问题中所说的,据我所知,那里的链接不允许包含请求头。由于这是一个跨领域的请求,这个问题仍然很模糊,请解释一下你想做什么,而不是你认为你应该如何做。请说明为什么不能简单地使用
    ?AJAX完全没有意义。只需使用常规的
    @light:正如我在问题中所说的,据我所知,那里的链接不允许包含请求头。由于这是一个跨领域的请求,这个问题仍然很模糊,请解释一下你想做什么,而不是你认为你应该如何做。请注意,据我所知,下载属性不允许您包含请求头。也许您没有完全解释您当时要做什么。确切地说,你需要做什么?点击一个按钮,我就会在URL上找到文件。该文件需要通过下载对话框下载,或者只需要像您预期的那样添加到浏览器下载中。请求需要能够获取头,因为这是一个跨域请求。这需要在主浏览器(例如,Chrome、Firefox、Safari)上工作。响应头将设置内容配置。如果您可以控制URL上的内容,则可以通过设置响应头来强制客户端下载。据我所知,下载属性不允许您包含请求头。也许您没有完全解释您要做什么。确切地说,你需要做什么?点击一个按钮,我就会在URL上找到文件。该文件需要通过下载对话框下载,或者只需要像您预期的那样添加到浏览器下载中。请求需要能够获取头,因为这是一个跨域请求。这需要在主浏览器(例如,Chrome、Firefox、Safari)上工作。响应头将设置内容配置。如果您可以控制URL上的内容,则可以通过设置响应头来强制客户端下载。