提问人:user1756980 提问时间:11/16/2012 最后编辑:isherwooduser1756980 更新时间:3/31/2022 访问量:994008
使用 JavaScript 创建和保存文件 [duplicate]
Create and save a file with JavaScript [duplicate]
问:
我有要写入文件的数据,并打开一个文件对话框供用户选择保存文件的位置。如果它适用于所有浏览器,那就太好了,但它必须在 Chrome 中运行。我想在客户端完成所有操作。
基本上我想知道在这个函数中放什么:
saveFile: function(data)
{
}
函数接收数据的位置,让用户选择保存文件的位置,并在该位置使用该数据创建文件。
如果有帮助的话,使用 HTML 也可以。
答:
你不能纯粹在 Javascript 中做到这一点。由于安全原因,在浏览器上运行的 Javascript 还没有足够的权限(已经有提案)。
相反,我建议使用 Downloadify:
一个小型的 javascript + Flash 库,无需服务器交互即可创建和下载文本文件。
您可以在此处查看一个简单的演示,您可以在其中提供内容并测试保存/取消/错误处理功能。
评论
对于最新的浏览器,如 Chrome,您可以使用文件 API,如本教程所示:
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.PERSISTENT, 5*1024*1024 /*5MB*/, saveFile, errorHandler);
评论
在创建文件之前,无法选择保存文件的位置。但是,至少在 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>
评论
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>
然后,您可以通过将 download 属性放在锚标记上来下载文件。
我之所以喜欢这个比创建数据 url 更好,是因为你不必做一个大的长 url,你可以只生成一个临时 url。
评论
if("URL"in window&&"createObjectURL"in URL&&"download"in Element.prototype)
Download is disallowed. The frame initiating or instantiating the download is sandboxed, but the flag ‘allow-downloads’ is not set. See https://www.chromestatus.com/feature/5706745674465280 for more details.
在控制台中尝试过这个,它有效。
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中,数据会在新选项卡中打开,并且必须手动保存此文件。
评论
var a = document.createElement("a")
else
<a>
type
对于 Chrome 和 Firefox,我一直在使用纯 JavaScript 方法。
(我的应用程序无法使用软件包,例如,它是由一个特殊的引擎提供的:一个 DSP,里面塞满了 WWWeb 服务器,几乎没有空间容纳任何东西。Blob.js
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';
}
注释、警告和黄鼠狼词:
- 我在 Linux (Maipo) 和 Windows(7 和 10)环境中运行的 Chrome 和 Firefox 客户端中都成功地使用了此代码。
- 但是,如果大于 MB,Chrome 有时会(仅有时)卡在自己的下载中,没有任何故障指示;到目前为止,Firefox还没有表现出这种行为。原因可能是 Chrome 中的某些 blob 限制。坦率地说,我只是不知道;如果有人有任何想法如何纠正(或至少检测),请发布。如果发生下载异常,当 Chrome 浏览器关闭时,它会生成诊断,例如
sourceText
- 此代码与 Edge 或 Internet Explorer 不兼容;我没有尝试过 Opera 或 Safari。
StreamSaver 是一种保存非常大的文件的替代方法,而无需将所有数据保留在内存中。
事实上,它模拟了服务器在保存文件时的所有内容,但所有客户端都与服务工作者一起模拟。
您可以获取编写器并手动将 Uint8Array 写入其中,也可以将二进制 readableStream 通过管道传输到可写流
下面举几个例子说明:
- 如何将多个文件保存为 zip
- 将 readableStream 从 例如 或 管道传输到 StreamSaver
Response
blob.stream()
- 键入内容时手动写入可写流
- 或重新编码视频/音频
下面是一个最简单形式的示例:
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
评论
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);
}
下一个:如何复制文件
评论