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

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

saveFile: function(data)
{
}

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

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


当前回答

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

其他回答

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

相反,我建议使用downadify:

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

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

不可能在创建文件之前选择保存文件的位置。但至少在Chrome中,仅使用JavaScript就可以生成文件。这是我创建CSV文件的一个老例子。用户将被提示下载它。不幸的是,这在其他浏览器中并不能很好地工作,尤其是IE。

<!DOCTYPE html>
<html>
<head>
    <title>JS CSV</title>
</head>
<body>
    <button id="b">export to CSV</button>
    <script type="text/javascript">
        function exportToCsv() {
            var myCsv = "Col1,Col2,Col3\nval1,val2,val3";

            window.open('data:text/csv;charset=utf-8,' + escape(myCsv));
        }

        var button = document.getElementById('b');
        button.addEventListener('click', exportToCsv);
    </script>
</body>
</html>

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

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));

Awesomeness01对代码的一个非常小的改进(不需要锚标签),增加了trueimage的建议(支持IE):

// Function to download data to a file
function download(data, filename, type) {
    var file = new Blob([data], {type: type});
    if (window.navigator.msSaveOrOpenBlob) // IE10+
        window.navigator.msSaveOrOpenBlob(file, filename);
    else { // Others
        var a = document.createElement("a"),
                url = URL.createObjectURL(file);
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        setTimeout(function() {
            document.body.removeChild(a);
            window.URL.revokeObjectURL(url);  
        }, 0); 
    }
}

测试在Chrome, FireFox和IE10中正常工作。

在Safari中,数据在一个新选项卡中打开,必须手动保存该文件。

对于最新的浏览器,如Chrome,你可以使用本教程中的文件API:

window.requestFileSystem  = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.PERSISTENT, 5*1024*1024 /*5MB*/, saveFile, errorHandler);