在运行客户端的应用程序中,在浏览器中,用Javascript编写,您可以使用本地存储来保持状态。如果用户需要能够从客户端应用程序中提取数据,则可以选择将内容发布到服务器并让服务器使用正确的内容类型和其他标头回显它以产生下载操作。
有没有办法使用纯客户端脚本生成这样的下载操作,而不将内容发布到服务器并回显它?
答案 0 :(得分:4)
我发现了如何执行此操作:您可以使用Blob
,createObjectURL()
和anchor
标记。
此JSFiddle显示的解决方案适用于Chrome和Internet Explorer,甚至还支持Chrome中的拖放保存(您可以将“保存”按钮拖动到Windows资源管理器中以保存文档。)http://jsfiddle.net/fa9y6/9/
首先,您必须构建一个Blob
来保存:
var blob = new Blob([ $('#documentContent').val() ], { type: mimeType });
在Internet Explorer中将其保存为文件最简单:
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, filename);
}
在Chrome(和Firefox )中,您可以构建anchor
代码和click()
代码:
var a = document.createElement('a');
a.download = filename;
a.href = window.URL.createObjectURL(blob);
a.click();
if (a.remove) a.remove();
要支持拖放文件保存,您需要将处理程序附加到dragstart
:
if (window.chrome) {
document.body.addEventListener('dragstart', function(e) {
// Some use a class, here. My sample only has one save button.
if (e.target.id == 'downloadButton') {
var blob = new Blob([ $('#documentContent').val() ], { type: mimeType });
e.dataTransfer.setData('DownloadURL', [mimeType, $('#fileName').val(), window.URL.createObjectURL(blob)].join(':'));
}
});
}
(我没有在较旧的浏览器版本中执行彻底的浏览器兼容性测试。)
答案 1 :(得分:3)
查看提供saveAs
功能的FileSaver.js:
var blob = new Blob(["Hello, world!"], {type: "text/plain;charset=utf-8"});
saveAs(blob, "hello world.txt");
它与IE10 +兼容。