使用HTML5 / Javascript来生成和保存文件

最近我一直在摆弄WebGL,并且得到了Collada阅读器的工作。 问题是它非常慢(Collada是一个非常冗长的格式),所以我将开始将文件转换为更易于使用的格式(可能是JSON)。 事情是,我已经有了解析Javascript中的文件的代码,所以我不妨将它用作我的导出器! 问题在于节省。

现在,我知道我可以解析文件,将结果发送到服务器,并让浏览器从服务器请求文件作为下载。 但实际上服务器与这个特定的过程无关,所以为什么要涉及它? 我已经在内存中有所需文件的内容。 有什么方法可以向用户提供使用纯JavaScript的下载? (我怀疑它,但不妨问......)

并且要清楚:我不想在没有用户知识的情况下访问文件系统! 用户将提供一个文件(可能通过拖放),脚本会将文件转换到内存中,并提示用户下载结果。 就浏览器而言,所有这些都应该是“安全”的活动。

[编辑]:我没有提及它,所以回答“Flash”的海报足够有效,但我正在做的一部分是试图强调可以用纯HTML5做什么......所以Flash是在我的情况下。 (尽管对于任何正在进行“真实”网络应用程序的人来说,这是一个完全有效的答案)。事实证明,除非我想涉及服务器,否则看起来我运气不佳。 不管怎么说,还是要谢谢你!


好的,创建一个data:URI对我来说绝对是个窍门,这要感谢Matthew和Dennkster指出了这个选择! 这基本上是我如何做到的:

1)将所有内容转换为一个名为“内容”的字符串(例如,通过在最初创建它或通过读取已构建页面的标记的innerHTML)。

2)建立数据URI:

uriContent = "data:application/octet-stream," + encodeURIComponent(content);

根据浏览器类型等,会有长度限制,但是例如Firefox 3.6.12可以运行至少256k。 使用encodeURIComponent在Base64中进行编码可能会使事情变得更有效率,但对于我来说,这没什么问题。

3)打开一个新窗口并将其“重定向”到此URI提示下载我的JavaScript生成页面的位置:

newWindow = window.open(uriContent, 'neuesDokument');

而已。


适用于HTML5的浏览器的简单解决方案...

function download(filename, text) {
    var pom = document.createElement('a');
    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    pom.setAttribute('download', filename);

    if (document.createEvent) {
        var event = document.createEvent('MouseEvents');
        event.initEvent('click', true, true);
        pom.dispatchEvent(event);
    }
    else {
        pom.click();
    }
}

用法

download('test.txt', 'Hello world!');

HTML5定义了一个window.saveAs(blob, filename)方法。 它现在不受任何浏览器支持。 但是有一个名为FileSaver.js的兼容库,它将这个功能添加到大多数现代浏览器(包括Internet Explorer 10+)中。 Internet Explorer 10支持navigator.msSaveBlob(blob, filename)方法(MSDN),该方法在FileSaver.js中用于Internet Explorer支持。

我写了一篇关于这个问题的更多细节的博客文章。

链接地址: http://www.djcxy.com/p/7771.html

上一篇: Using HTML5/Javascript to generate and save a file

下一篇: Will HTML5 allow web apps to make peer