繁体   English   中英

如何让Web浏览器下载存储在JavaScript String中的文件?

[英]How to get a web browser to download a file that is stored in a JavaScript String?

我已经能够编写JavaScript以使浏览器使用以下代码从远程服务器下载文件:

var iframe = document.createElement("iframe");
iframe.style.display = "none";
iframe.src = "filename.zip"
document.body.appendChild(iframe);

哪个效果很好。 但是,现在我有一个不同的情况,在浏览器端我的JavaScript中的文件内容存储在一个字符串中,我需要触发该文件的下载。 我试过用这个替换上面的第三行,其中'myFileContents'是包含文件实际字节的字符串:

iframe.src = "data:application/octet-stream;base64," + Base64.encode(myFileContents);

这会导致文件下载,但文件名丢失。 在Chrome中,文件名只是“下载”。 另外我读过一些浏览器版本允许的文件大小有限制。

有没有办法实现这个目标? 使用JQuery就行了。 该解决方案需要支持任何文件类型 - zip,pdf,csv,png,jpg,xls等...

一些较新的浏览器中,您可以使用a标签上的新HTML5下载属性来实现此目的:

var a = document.createElement('a');
a.download = "filename.txt";
a.href = "data:application/octet-stream;base64," + Base64.encode(myFileContents);
a.click();

对于未来的解决方案,您可以查看HTML5 FileSystem API ,但目前大多数主流浏览器都不支持此API。 它对您来说可能没有多大用处,除非它可能为您提供另一种在本地存储文件的方法,如果您可以使用它。 但它不会将文件存储在用户本地可访问的文件系统上,您必须开发自己的基于浏览器的界面,以便用户与文件进行交互。 在任何情况下,使用标签上的新下载属性再次将文件从HTML5文件系统下载到用户本地文件系统,然后a标签将引用HTML5文件系统中的位置而不是引用在线位置。

要使用iframe元素执行此操作,您必须以某种方式将iframe上的Content-Disposition请求标头设置为inline; filename="filename.txt" inline; filename="filename.txt"使用客户端JavaScript,我认为不可能这样做,很可能是因为安全问题。 如果你真的没有任何其他选择,你可以通过使用AJAX将字符串发送到服务器,然后再次使用正确的请求标头设置从那里下载来终止下载速度性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM