有没有办法用JavaScript“模拟”右键另存为命令或强制下载浏览器中的文件?

6
我有这样一个情况,我们在全球CDN上存储媒体文件。我们的Web应用程序托管在自己的服务器上,需要时从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>

重新编辑:好吧,那个想法泡汤了 -> execCommand SaveAs在Firefox中可行吗?


1
我们假设您无法配置CDN,只能将文件上传到CDN? CDN可能会检查内容以编写HTTP标头 - 是否可以以任何方式操纵它? - Josh Lee
我不认为有这样的配置,但是我会检查一下,以防万一是否有一种方法可以设置特定文件夹的不同交付方式。 - MetaGuru
2个回答

2

你的CDN是否允许您指定HTTP头?例如,亚马逊CloudFront可以。


现在正在研究,您能否在亚马逊上为不同目录指定不同的HTTP标头?如果我进行全面性更改,那么其他事情可能会出问题。 - MetaGuru
看起来是每个文件单独设置,但有一个API可以进行更广泛的更改(和客户端)。我不使用它,但我查过了,你可以为每个文件添加自定义的HTTP头。 - Lou Franco

1
我发现了一个对我有用的简单解决方案。在文件名后面添加一个URL参数。这样可以欺骗浏览器绕过其内置的文件映射。例如,将客户端链接设置为指向http://mydomain.com/file.pdf?(加上一个问号)而不是http://mydomain.com/file.pdf。请保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接