Javascript,以编程方式触发Firefox中的文件下载[关闭]

Posted

技术标签:

【中文标题】Javascript,以编程方式触发Firefox中的文件下载[关闭]【英文标题】:Javascript, programmatically trigger file download in firefox [closed] 【发布时间】:2012-09-22 12:01:58 【问题描述】:

我希望用户下载内存中的数据 uri。

这个小提琴适用于 chrome 但不适用于 FF:http://jsfiddle.net/6W2TY/

当您单击运行时,它将下载 chrome 中的小图像,而在 FF 中什么也不做。谁能帮我理解为什么它在 FF 中不起作用以及我需要做什么才能使它起作用?

谢谢!

【问题讨论】:

小提琴链接不起作用。为了后代,您可以在问题中发布代码吗? 【参考方案1】:

您正在使用新的 (html5) download attribute。 据我所知,这仅在 Chrome 中受支持,而在 Firefox 中尚不支持。

2018 年 3 月更新almost all major browsers 现在支持此功能(不支持 IE)。

替代方案:使用 location.href

另一种强制下载的方法是将用户重定向到这样的图像:

// generate the image
var img = ""

// then call a function maybe onClick or something
downloadImage(img);

function downloadImage(data) 
    location.href = "data:application/octet-stream;base64," + data;

或短版

location.href = "data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABWSURBVDhPY0xISPh//0UOA7mAiVyNMH2jBjAwkBQGjD9KGBTEJ6OEO0kG2NvbMwCjnXwDsEU5SS5ANuDhjRCGJbPFSQsDdBfIyMhQZgDIQLK9QLWkDABPsQw5I+5qmAAAAABJRU5ErkJggg=="

替代方案:服务器端

作为替代方案,如果您在服务器端处理图像,您可以通过设置 content-disposition 标头来强制下载。

PHP 示例

header('Content-Disposition: attachment; filename="image.png"');

【讨论】:

我正在构建我希望用户能够下载客户端的图像。有什么方法可以让用户下载我在 FF 中拥有 data-uri 的客户端图像?看起来下载属性已经在 chrome 中使用了一年多,所以我不确定 FF 是否有任何计划支持它。 我添加了我的答案以包含仅 javascript 的替代方案。这是你可以使用的东西吗? 不幸的是 location.href 选项意味着文件没有正确的 mime 类型,我无法将默认文件名设置为任何合理的名称,有没有办法解决这个问题?将此标记为答案,因为它非常有帮助。谢谢。 我不知道你是否读过这篇文章,但我能想到的设置 mime 类型和文件名的唯一解决方案(解决方法/hack)是将图像发送回服务器并返回它再次使用正确的标题。 注意:这种方法可能会触发 'beforeunload' 事件【参考方案2】:

我意识到这是一篇旧帖子,但是当我在 FF 中下载文件时遇到类似问题时,我遇到了它。在编写问题时,这可能在 FF 中不起作用,但现在可以。

a = document.createElement('a');
document.body.appendChild(a);
a.download = name;
a.href = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABWSURBVDhPY0xISPh//0UOA7mAiVyNMH2jBjAwkBQGjD9KGBTEJ6OEO0kG2NvbMwCjnXwDsEU5SS5ANuDhjRCGJbPFSQsDdBfIyMhQZgDIQLK9QLWkDABPsQw5I+5qmAAAAABJRU5ErkJggg==";
a.click();

原小提琴的变化:

    添加电话到document.body.appendChild(a);triggerEvent() 更改为a.click()

这是一个更新的小提琴: http://jsfiddle.net/70f91ao7/6/

【讨论】:

关键是将它附加到 DOM 以便这种方法在 Firefox 下工作 ***.com/a/23873370/5841382 这可能不再起作用了 为什么需要将元素添加到 DOM 中?在 Chrom (96) 上它可以正常工作,而无需

以上是关于Javascript,以编程方式触发Firefox中的文件下载[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中,我可以以编程方式为文件输入元素触发“点击”事件吗?

如何以编程方式单击 JavaScript 中的元素?

以编程方式触发 jsdom 窗口中的滚动或按键事件

以编程方式更改 html 选择下拉菜单后,onchange 不会触发

为啥 Chrome 和 Firefox 以不同方式处理 jQuery ajax() 回调中设置的 javascript 变量?

为啥 Chrome 和 Firefox 以不同方式处理 jQuery ajax() 回调中设置的 javascript 变量?