2009-07-13 34 views
7

是否有可能在Javascript中提示用户下载实际上不在服务器上但具有脚本变量内容的文件?正在下载一个变量

在精神上的东西有:

var contents = "Foo bar"; 
invoke_download_dialog(contents, "text/plain"); 

干杯,

MH

+2

这听起来像是一个严重的安全缺陷 – 2009-07-13 16:22:14

+0

有趣的问题。 +1 – MitMaro 2009-07-13 16:22:15

回答

4

javascript:URIs应该为此工作 - 事实上,这正是他们的意思。但是,IE不尊重类型属性,并且在Safari中,此技术完全没有效果。

数据:URI在Firefox(3.0.11)和Safari(4.0)(可能还有其他兼容的浏览器)中工作,但我无法在IE(8.0)中使用此方法。 (在Windows所有测试)

<a href="data:text/plain,The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog.">Data URI</a>

这本身不是一个JS解决方案,但JS可以用来动态地设置在href。使用转义函数将原始文本/数据转换为URI编码形式。

与检测IE和使用已经挂可能做你想要的IE特定的解决方案相结合这一....

我要补充一点,你不能强迫它触发一个下载对话框(这是超越HTML和JS的范围),但可以通过将application/octet-stream设置为类型来说服它。麻烦的是,用户将不得不手动添加正确的文件扩展名。

1

没有具体通过JavaScript,但你可以在变量的值发布到服务器端页面,这将迫使用户以文本形式下载内容。

2

请参阅我的问题的接受答案here。这只能在IE浏览器中使用。

+0

下面是该行,为您节省点击:document.execCommand('SaveAs',true,'file.xml'); – 2010-02-13 22:20:16

1

请记住,如果页面上存在任何跨站脚本漏洞,该变量可能会被恶意数据覆盖。尽管生成的文件的内容类型仍需要绕过可执行文件,但仍存在风险。

我认为一个更安全的方法是使用Joel的答案并在发送数据发送给用户之前对发布的数据进行验证。

+0

如果存在跨站点脚本漏洞,恶意用户可以在您的站点上运行任何JavaScript,包括Stewart的代码;无论您是否选择在当地使用公认的解决方案都无关紧要! – 2010-02-13 22:34:28

+0

这就是为什么我倾向于服务器端解决方案,其中结果不依赖于JS。当然,如果客户受到足够的损害,*不*安全数量将有所帮助。 – 2010-02-15 17:49:07

2

一个可能的选择是使用JavaScript通过data:URL方案使用JavaScript生成一个带有href的链接,这可能需要一些花哨的编码才能正确拉取。

0

结账jsPDF;它允许下载(或嵌入查看)完全在浏览器内生成的PDF文件。他们声称:“客户端演示在Safari或iPhone Safari中效果最佳,同时在Windows和Opera上支持Firefox 3,在路上支持IE。”因此,他们似乎掌握了如何在主流浏览器中调用下载。