通过更改带有Safari的window.location来下载文件

spe*_*peg 5 javascript safari url

我有一个离线html文件,通过将window.location设置为生成并保存CSV

data:text/csv;base64,Intfa2V5fSIsInt...
Run Code Online (Sandbox Code Playgroud)

但是,在Safari中,这只会在浏览器中显示CSV.

将网址设置为:

data:application/csv;base64,Intfa2V5fSIsInt...
Run Code Online (Sandbox Code Playgroud)

强制Safari下载文件 - 但它获得的通用文件名只是'Unknown-3'.有没有办法指定文件名?

jos*_*736 6

首先,警告:application/csv不是有效的MIME类型,因此在这种情况下它"适用"的事实纯粹是一个实现怪癖,将来很可能会改变.(例如,Safari 显示 application/octet-stream,我希望下载.)

HTML5确实有一个<a download="file.name">属性.这会强制浏览器将文件下载到磁盘; 它使用属性的值作为默认文件名.它与数据URI或blob URI 一起使用.(演示)

但是,它目前仅受Chrome(14+)支持.Safari 5.1忽略该属性.


一种可能的替代方法是使用Filesystem API,但这会为您提供一个沙盒文件夹.例如,您无法将文件直接保存到用户的Documents文件夹中.相反,您可以将文件写入沙箱,然后重定向到新filesystem架构上的文件:

location.assign('filesystem:http://example.com/temporary/somefile.csv');
Run Code Online (Sandbox Code Playgroud)

这应该调用UA的下载机制(使用正确的文件名!),但我没有测试过,所以Safari可能只会显示文件.