AJAX(或类似AJAX)文件下载

3
这是一个经常以各种不同方式提出的问题,我已经收集了一些链接并解释了它们为什么不适用。我正在寻找以下需求的完整解决方案。
在我所开发的Web应用程序中,需要进行类似于AJAX的文件下载,并满足以下要求:
  1. 用户单击链接以下载文件,而不被重定向到新页面,将收到我们所有人在Web浏览器中用于下载文件的正常“另存为..”对话框
  2. 如果由于某种原因服务器无法提供文件,则应调用JavaScript回调。同样,如果服务器成功提供文件
  3. 需要能够修改HTTP请求头,例如在请求中指定Content-Type HTTP标头
  4. 支持所有A级浏览器
到目前为止研究过的内容:

a. jquery.fileDownload非常优雅地解决了需求1、2和4,它使用表单提交、隐藏的iframe以及服务器设置特定cookie的组合。我对这个项目非常熟悉(也做出过贡献)。然而,需求3不被支持,因为HTML表单提交和iframe(该库使用)不允许指定请求的服务器资源的HTTP头。(jdownloader也使用类似的iframe/form技术,但它也无法解决需求3)。

b. 可以使用XMLHttpRequest从文件中检索二进制数据(使用不同浏览器的各种技巧(链接1, 链接2, 链接3, 链接4, 链接5, 链接6, 链接7, 链接8)。但是它们都不能满足需求1。二进制数据可以保存在javascript变量中,但没有办法调用浏览器的“另存为…”对话框,允许用户将此二进制数据保存到硬盘上的文件中。

c. 这个链接(在“DOWNLOAD + SAVE FILES TO THE HTML5 FILE SYSTEM”标题下)提供了一个完整的端到端解决方案,使用XHR2并满足1、2和3的要求。但是它的支持很差(使用非常新的HTML5 FileWriter)。

是否有任何完整的解决方案?

编辑 我们有更多选项-我计划测试。也许唯一的选择是通过收集所有的hack/解决方案来开发一个库,以创建一个通用的解决方案。

根据fibertech的解决方案:使用上述(b)解决方案将文件保存到变量中,然后: 对于Internet Explorer:使用IE的execCommand()保存此数据 对于其他浏览器:使用data uris (link 2)和HTML5 download属性的<a>标签指定名称(link 1, link 2, link 3, link 4) 此链接提到了使用画布的文件下载功能的某些内容 Downloadify (以及这个链接也是如此) 一个看似相关的链接,涉及Web Workers但正在使用Blob和FileApi生成文件。
1个回答

0

仅限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>

将文本域中的内容保存到文件,文件名与文本域ID相同。

其他浏览器可以参考此链接:Firefox是否支持execCommand SaveAs函数?

测试用例和实现示例:http://jsfiddle.net/YhdSC/1/ (仅限IE)


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接