Sea*_* N. 8 javascript iframe local download
我已经能够编写JavaScript以使浏览器使用以下代码从远程服务器下载文件:
var iframe = document.createElement("iframe");
iframe.style.display = "none";
iframe.src = "filename.zip"
document.body.appendChild(iframe);
Run Code Online (Sandbox Code Playgroud)
哪个效果很好.但是,现在我有一个不同的情况,文件的内容存储在浏览器端的JavaScript中的字符串中,我需要触发该文件的下载.我试过用这个替换上面的第三行,其中'myFileContents'是包含文件实际字节的字符串:
iframe.src = "data:application/octet-stream;base64," + Base64.encode(myFileContents);
Run Code Online (Sandbox Code Playgroud)
这会导致文件下载,但文件名丢失.在Chrome中,文件名只是"下载".另外我读过一些浏览器版本允许的文件大小有限制.
有没有办法实现这个目标?使用JQuery就行了.该解决方案需要支持任何文件类型 - zip,pdf,csv,png,jpg,xls等...
Mat*_*tra 10
在一些较新的浏览器中,您可以使用标记上的新HTML5下载属性a来实现此目的:
var a = document.createElement('a');
a.download = "filename.txt";
a.href = "data:application/octet-stream;base64," + Base64.encode(myFileContents);
a.click();
Run Code Online (Sandbox Code Playgroud)
对于未来的解决方案,您可以查看HTML5 FileSystem API,但目前大多数主流浏览器都不支持此API .它对您来说可能没什么用处,除非它可能为您提供另一种在本地存储文件的方法,如果您可以使用它.但它不会将文件存储在用户本地可访问的文件系统上,您必须开发自己的基于浏览器的界面,以便用户与文件进行交互.在任何情况下,将文件从HTML5文件系统下载到用户本地文件系统将再次使用a标签上的新下载属性来完成,该标签将引用HTML5文件系统中的位置而不是引用在线位置.
要使用iframe元素执行此操作,您必须以某种方式将Content-Dispositioniframe上的请求标头设置为inline; filename="filename.txt"使用客户端JavaScript,我认为不可能这样做,很可能是因为安全问题.如果你真的没有任何其他选项,你可以通过使用AJAX将字符串发送到服务器,然后再次使用正确的请求标头设置从那里下载来终止下载速度性能.