我有一个网站,提示用户从外部资源下载文件。由于外部文件名被散列并且用户下载了多个文件,因此用户很难知道他们下载的文件到达了他们请求的资源。例如,fdae442dafe42.zip
的文件名可以是production-resources.zip
。
我正在寻找方法,以便浏览器将该文件作为不同的名称下载。以下是我的一些想法以及为什么他们不会工作,但您可以找到解决方法。
请注意,我无法控制外部资源。我无法对标题或其他任何内容进行更改。我的服务是一个主要针对桌面用户的网站。 Android和iOS解决方案并没有那么有用。
下载属性
此方法在Google Chrome和Firefox中运行了一段时间,但后来他们开始关注W3 HTML5 spec。外部资源需要发送{Chrome}和Firefox之前未检查过的Content-Disposition
标题。
PHP代理下载
我知道我可以让PHP脚本向外部资源发出请求,然后在更改标题和名称以满足我的需求时将其提供给最终用户。问题是网站流量很大,每个用户下载大约1-2GB的数据。我的服务器无法处理这种类型的流量,升级服务器可能成本太高。
使用外部应用程序重命名文件
我正在考虑使用外部应用程序(可能是Chrome / Firefox扩展程序),它们会在完成下载后重命名这些文件。但考虑到我的观众中有足够多的是一次性访问者,要求他们下载应用程序或扩展程序是不太可能的。
Flash或Java嵌入式解决方案
我正在考虑使用Java或Flash嵌入式文件来处理文件下载,但我对这两个平台都不太了解。据我所知,Flash无法控制用户的文件系统,因此这可能是一个问题。 Java将能够完成这项任务,但我真的希望我不必使用Java,因为它经常不安全,需要大量下载来安装它(与外部软件的想法相同)。 / p>
如果您对我可能采取的措施有什么想法来解决这个问题,我们将不胜感激。我没有找到任何代码,只是关于我将如何完成上述任务的想法。我想感谢你们所有的时间和专业知识。
答案 0 :(得分:1)
您所指的外部资源是什么?
如果它恰好是亚马逊的S3,它允许您生成下载URL并指定下载时服务器响应中应该出现的Content-Disposition。在那里,您可以编码浏览器在保存文件时应使用的文件名。
如果是其他服务,请查看其文档,也许它具有相似的功能。
答案 1 :(得分:0)
如果您通过Access-Control-Allow-Origin在目标服务器上进行了身份验证,那么将这两种方法结合起来可能对您有所帮助:
How to set custom http headers when changing iframe src?
$.ajax({
type: "GET",
url: "https://app.icontact.com/icp/a/",
contentType: "application/json",
beforeSend: function(xhr, settings){
xhr.setRequestHeader("some_custom_header", "foo");},
success: function(data){
$("#output_iframe_id").attr('src',"data:text/html;charset=utf-8," + escape(data))
}
});
JavaScript/jQuery to download file via POST with JSON data
$.post('/create_binary_file.php', postData, function(retData) {
$("body").append("<iframe src='" + retData.url+ "' style='display: none;' ></iframe>");
});
答案 2 :(得分:0)
使用&#34;下载&#34;标签的属性&#34; a&#34;。
<a href="http://external.server/path/to/file" download="name_you_want.ext">download</a>
这应该适用于最新的Chrome和Firefox,但不适用于IE。