有啥方法可以“模拟”右键单击另存为命令或使用 JavaScript 在浏览器中强制下载文件?

Posted

技术标签:

【中文标题】有啥方法可以“模拟”右键单击另存为命令或使用 JavaScript 在浏览器中强制下载文件?【英文标题】:Is there any way to 'simulate' right-click save-as command or force download of file in the browser with JavaScript?有什么方法可以“模拟”右键单击另存为命令或使用 JavaScript 在浏览器中强制下载文件? 【发布时间】:2010-09-14 17:50:49 【问题描述】:

我有这种情况,我们将媒体文件存储在全球 CDN 上。我们的网络应用程序托管在它自己的服务器上,然后在需要媒体资产时从 CDN url 调用它们。最近我们有一个用户可以下载文件附件的页面,但是某些文件类型是在浏览器中打开而不是下载(例如 MP3)。解决这个问题的唯一方法是手动指定附加文件的 HTTP 响应,但我能做到这一点的唯一方法是将文件从 CDN 下载到我的服务器,然后将其反馈给用户,这违背了拥有它的目的在全球 CDN 上。相反,我想知道是否有一些客户端解决方案?

编辑:刚刚在某个地方找到了这个,虽然我不确定它是否可以在所有浏览器中正常工作?

<body>
<script>
function downloadme(x)
myTempWindow = window.open(x,'','left=10000,screenX=10000');
myTempWindow.document.execCommand('SaveAs','null','download.pdf');
myTempWindow.close();

</script>

<a href=javascript:downloadme('/test.pdf');>Download this pdf</a>
</body>

重新编辑:哦,好吧,这个想法就这么多 -> Does execCommand SaveAs work in Firefox?

【问题讨论】:

我们假设你不能配置CDN,只能上传文件?据推测,CDN 会检查内容以写入 HTTP 标头——可以以任何方式对其进行操作吗? 我不认为有任何这样的配置,但我会检查以防万一,例如有一种方法可以为某个文件夹设置不同的交付方式。 【参考方案1】:

您的 CDN 是否允许您指定 HTTP 标头?例如,Amazon cloudfront 就是这样做的。

【讨论】:

现在看看这个,在亚马逊上,你可以为不同的目录指定不同的 HTTP 头吗?我不能像那样做一个包罗万象的改变,否则其他事情会被破坏。 看起来像每个文件,但有一个 API 可以进行更广泛的更改(和客户端)。我不使用它,但我查了一下,您可以为每个文件添加自定义 HTTP 标头。【参考方案2】:

我找到了一个对我有用的简单解决方案。将 URL 参数添加到文件名。这将诱使浏览器绕过它内置的文件映射。例如,而不是 http://mydomain.com/file.pdf ,将您的客户端链接设置为指向 http://mydomain.com/file.pdf? (加了一个问号)

【讨论】:

以上是关于有啥方法可以“模拟”右键单击另存为命令或使用 JavaScript 在浏览器中强制下载文件?的主要内容,如果未能解决你的问题,请参考以下文章

右键单击“另存为”事件问题

模拟右键单击图像

html 表单生成链接。当您需要右键单击并“目标另存为”或制作JavaScript书签时非常有用。

我想在用户右键单击时更改另存为对话框文件名

当我单击另存为 HTML 而不是右键单击浏览器并保存时,如何将 React 单页保存为 HTML

在 React 中单击“将图像另存为”