我有想要写入文件的数据,并打开一个文件对话框供用户选择保存文件的位置。如果它能在所有浏览器中工作就太好了,但它必须在Chrome中工作。我想在客户端完成。

基本上我想知道在这个函数里放什么

saveFile: function(data)
{
}

函数接收数据,让用户选择保存文件的位置,并在该位置用该数据创建一个文件。

如果有帮助的话,使用HTML也很好。


当前回答

函数下载(文本,名称,类型){ var a = document.getElementById("a"); var file = new Blob([text], {type: type}); a.href = URL.createObjectURL(文件); A.download = name; } <a href="" id="a">点击这里下载你的文件</a> <button onclick="download('file text', 'myfilename.txt', 'text/plain')"> < / >创建文件按钮

然后,您可以通过将download属性放在锚标记上来下载文件。

我喜欢这个比创建一个数据url更好的原因是,你不需要做一个很大很长的url,你可以只生成一个临时的url。

其他回答

对于Chrome和Firefox,我一直使用纯JavaScript方法。

(我的应用程序不能使用Blob.js这样的包,因为它是由一个特殊的引擎提供的:一个DSP和一个WWWeb服务器,几乎没有空间容纳任何东西。)

function FileSave(sourceText, fileIdentity) {
    var workElement = document.createElement("a");
    if ('download' in workElement) {
        workElement.href = "data:" + 'text/plain' + "charset=utf-8," + escape(sourceText);
        workElement.setAttribute("download", fileIdentity);
        document.body.appendChild(workElement);
        var eventMouse = document.createEvent("MouseEvents");
        eventMouse.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        workElement.dispatchEvent(eventMouse);
        document.body.removeChild(workElement);
    } else throw 'File saving not supported for this browser';
}

注释、警告和模棱两可的词语:

I have had success with this code in both Chrome and Firefox clients running in Linux (Maipo) and Windows (7 and 10) environments. However, if sourceText is larger than a MB, Chrome sometimes (only sometimes) gets stuck in its own download without any failure indication; Firefox, so far, has not exhibited this behavior. The cause might be some blob limitation in Chrome. Frankly, I just don't know; if anybody has any ideas how to correct (or at least detect), please post. If the download anomaly occurs, when the Chrome browser is closed, it generates a diagnostic such as This code is not compatible with Edge or Internet Explorer; I have not tried Opera or Safari.

这个项目在github上看起来很有前途:

https://github.com/eligrey/FileSaver.js

中的FileSaver.js实现了W3C saveAs() FileSaver接口 本机不支持的浏览器。

也可以看看这里的演示:

http://eligrey.com/demos/FileSaver.js/

StreamSaver是保存非常大的文件的替代方案,而不必将所有数据保存在内存中。事实上,它模拟了服务器保存文件时的所有剂量,但所有客户端都使用service worker。

你可以获取写入器并手动写入Uint8Array的Uint8Array,或者将二进制readableStream管道到可写流

下面有几个例子:

如何将多个文件保存为zip文件 管道readableStream从响应或blob.stream()到StreamSaver 在输入内容时手动写入可写流 或者重新录制视频/音频

下面是一个最简单的例子:

const fileStream = streamSaver.createWriteStream('filename.txt')

new Response('StreamSaver is awesome').body
  .pipeTo(fileStream)
  .then(success, error)

如果你想保存一个blob,你只需要把它转换成一个readableStream

new Response(blob).body.pipeTo(...) // response hack
blob.stream().pipeTo(...) // feature reference

在控制台中尝试了这一点,并且它可以工作。

var aFileParts = ['<a id="a"><b id="b">hey!</b></a>'];
var oMyBlob = new Blob(aFileParts, {type : 'text/html'}); // the blob
window.open(URL.createObjectURL(oMyBlob));

你不能单纯地在Javascript中做到这一点。由于安全原因,Javascript在浏览器上运行还没有足够的权限(已经提出了建议)。

相反,我建议使用downadify:

一个微小的javascript + Flash库,可以创建和下载文本文件,无需服务器交互。

您可以在这里看到一个简单的演示,其中提供内容并测试保存/取消/错误处理功能。