我有一些数据想要写入一个文件,并打开一个文件对话框,让用户选择保存文件的位置。最好是能在所有浏览器上都能正常运行,但至少需要在Chrome上正常工作。 我希望这一切都是在客户端完成的。
基本上,我想知道在这个函数中应该放什么:
saveFile: function(data)
{
}
该函数接受数据,要求用户选择保存文件的位置,并在该位置创建一个包含该数据的文件。
如果有帮助的话,也可以使用HTML。
我有一些数据想要写入一个文件,并打开一个文件对话框,让用户选择保存文件的位置。最好是能在所有浏览器上都能正常运行,但至少需要在Chrome上正常工作。 我希望这一切都是在客户端完成的。
基本上,我想知道在这个函数中应该放什么:
saveFile: function(data)
{
}
该函数接受数据,要求用户选择保存文件的位置,并在该位置创建一个包含该数据的文件。
如果有帮助的话,也可以使用HTML。
根据trueimage的建议(支持IE),Awesomeness01的代码进行了非常小的改进(不需要锚标签):
// 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中,数据会在新标签页中打开,您需要手动保存该文件。
function download(text, name, type) {
var a = document.getElementById("a");
var file = new Blob([text], {type: type});
a.href = URL.createObjectURL(file);
a.download = name;
}
<a href="" id="a">click here to download your file</a>
<button onclick="download('file text', 'myfilename.txt', 'text/plain')">Create file</button>
然后,您可以在锚标签上加上下载属性来下载文件。
我喜欢这种方法胜过创建数据URL的原因是您不必生成一个很长的URL,而是可以生成一个临时URL。
if("URL"in window&&"createObjectURL"in URL&&"download"in Element.prototype)
,否则你需要更改下载方法或者注意到浏览器不支持所需的对象来下载文件。 - user5066707下载被禁止。启动或实例化下载的框架被沙盒化,但未设置“allow-downloads”标志。有关更多详细信息,请参见https://www.chromestatus.com/feature/5706745674465280。
- posfan12这个在 Github 上的项目看起来很有前途:
https://github.com/eligrey/FileSaver.js
FileSaver.js 在不支持 W3C saveAs() FileSaver 接口的浏览器中实现了该接口。
同时,请查看这里的演示:
在创建文件之前选择文件保存位置是不可能的。但至少在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>
对于像Chrome这样的最新浏览器,您可以使用此教程中所示的文件API:
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.PERSISTENT, 5*1024*1024 /*5MB*/, saveFile, errorHandler);
function SaveBlobAs(blob, file_name) {
if (typeof navigator.msSaveBlob == "function")
return navigator.msSaveBlob(blob, file_name);
var saver = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
var blobURL = saver.href = URL.createObjectURL(blob),
body = document.body;
saver.download = file_name;
body.appendChild(saver);
saver.dispatchEvent(new MouseEvent("click"));
body.removeChild(saver);
URL.revokeObjectURL(blobURL);
}
我在控制台尝试了一下,它有效。
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权限还不足(曾经有提议)。
相反,我建议使用Downloadify:
一个微小的javascript + Flash库,使得能够创建和下载文本文件而无需与服务器交互。
您可以在这里看到一个简单的演示,其中您提供内容并可以测试保存/取消/错误处理功能。
StreamSaver是一个用于保存非常大的文件而不必将所有数据保存在内存中的替代方案。
实际上,它模拟了服务器在保存文件时所做的一切工作,但全部在客户端使用服务工作者完成。
您可以获取写入器并手动向其中写入Uint8Array,也可以将二进制readableStream传输到可写流。
这里有一些示例展示:
Response
或blob.stream()
传输到StreamSaver这是最简单形式的示例:
const fileStream = streamSaver.createWriteStream('filename.txt')
new Response('StreamSaver is awesome').body
.pipeTo(fileStream)
.then(success, error)
new Response(blob).body.pipeTo(...) // response hack
blob.stream().pipeTo(...) // feature reference
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';
}
注意事项、警告及需要说明的: