Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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
Jquery AJAX(或AJAX风格)文件下载_Jquery_Ajax_Http_Http Headers_Download - Fatal编程技术网

Jquery AJAX(或AJAX风格)文件下载

Jquery AJAX(或AJAX风格)文件下载,jquery,ajax,http,http-headers,download,Jquery,Ajax,Http,Http Headers,Download,这是一个以各种不同方式提出的常见问题,我收集了下面的一些链接,并解释了为什么它们不起作用。我正在寻找以下问题的完整解决方案 在我正在开发的web应用程序中,需要下载AJAX风格的文件,并满足以下要求 用户可以单击链接下载文件,而无需指向新页面,将收到一个正常的“另存为…”对话框,我们都习惯于在web浏览器中下载文件 如果由于某种原因服务器无法提供文件,则应调用javascript回调。类似地,如果服务器成功地提供文件 需要能够修改HTTP请求头,以指定请求中的内容类型HTTP头 支持所有A级浏览

这是一个以各种不同方式提出的常见问题,我收集了下面的一些链接,并解释了为什么它们不起作用。我正在寻找以下问题的完整解决方案

在我正在开发的web应用程序中,需要下载AJAX风格的文件,并满足以下要求

  • 用户可以单击链接下载文件,而无需指向新页面,将收到一个正常的“另存为…”对话框,我们都习惯于在web浏览器中下载文件
  • 如果由于某种原因服务器无法提供文件,则应调用javascript回调。类似地,如果服务器成功地提供文件
  • 需要能够修改HTTP请求头,以指定请求中的内容类型HTTP头
  • 支持所有A级浏览器
  • 目前研究的内容:

    a。通过使用表单提交、隐藏iFrame和让服务器设置特定cookie的组合,非常优雅地解决了需求1、2和4。我对这个项目非常熟悉(我也参与了)。但不支持要求3,因为HTML表单提交和iFrame(此库使用)不允许为请求的服务器资源指定HTTP头。(也使用类似的iframe/form技术,但它也不能解决需求3)

    b。可以使用XMLHttpRequest从文件中检索二进制数据(针对不同的浏览器(、、、、)有各种各样的破解方法)。但它们都不能满足要求1。二进制数据可以保存在javascript变量中,但无法调用浏览器的“另存为…”对话框,允许用户将此二进制数据保存到硬盘上的文件中

    c、 (在“下载+将文件保存到HTML5文件系统”标题下)有一个完整的端到端解决方案,使用XHR2并满足需求1、2和3。但它的支持情况很差(使用非常新的HTML5 FileWriter)

    有完整的解决方案吗

    编辑 我们还有更多的选择——我计划对此进行测试。也许唯一的选择是通过收集所有的黑客/解决方案来开发一个库来解决这个问题,以便创建一个通用的解决方案

  • 根据fibertech下面的解决方案:使用上面的解决方案(b)将文件保存到变量中,然后:

    对于Internet Explorer:使用IE的execCommand()保存此数据

    对于其他人:使用()和HTML5下载属性,,)

  • 提到了与使用canvas的文件下载功能有关的内容

  • (还有)

  • 一个看似与web工作人员相关,但与Blob和生成文件相关的应用程序

  • IE唯一解决方案:

    function SaveContents(element) {
        if (typeof element == "string")
            element = document.getElementById(element);
        if (element) {
            if (document.execCommand) {
                var oWin = window.open("about:blank", "_blank");
                oWin.document.write(element.value);
                oWin.document.close();
                var success = oWin.document.execCommand('SaveAs', true, element.id)
                oWin.close();
                if (!success)
                    alert("Sorry, your browser does not support this feature");
            }
        }
    }
    
    所需的HTML示例:

    <textarea id="myText"></textarea><br />
    <button type="button" onclick="SaveContents('myText');">Save</button>
    

    拯救
    这将把给定textarea的内容保存到一个名为textarea ID的文件中

    对于其他浏览器,您可以阅读以下内容:


    测试用例和工作示例:(仅IE…)

    那么,将我原始问题(b)中的解决方案与您的IE技术和其他浏览器的数据URI结合起来会解决问题吗?