Javascript 下载外部资源-重命名文件

Javascript 下载外部资源-重命名文件,javascript,php,html,Javascript,Php,Html,我有一个网站,提示用户从外部资源下载文件。由于外部文件名是散列的,用户下载多个文件,因此用户很难知道他们下载的文件达到了他们请求的资源。例如,fdae442dafe42.zip的文件名可以是production resources.zip 我正在寻找方法,让它的浏览器将下载文件作为一个不同的名称。下面是我的一些想法以及它们不起作用的原因,但你可能会找到解决办法 请注意,我无法控制外部资源。我将无法对标题或任何其他内容进行更改。我的服务是一个主要面向桌面用户的网站。Android和iOS解决方案不

我有一个网站,提示用户从外部资源下载文件。由于外部文件名是散列的,用户下载多个文件,因此用户很难知道他们下载的文件达到了他们请求的资源。例如,
fdae442dafe42.zip的文件名可以是
production resources.zip

我正在寻找方法,让它的浏览器将下载文件作为一个不同的名称。下面是我的一些想法以及它们不起作用的原因,但你可能会找到解决办法

请注意,我无法控制外部资源。我将无法对标题或任何其他内容进行更改。我的服务是一个主要面向桌面用户的网站。Android和iOS解决方案不会有那么大的好处

下载属性

这个方法在Google Chrome和Firefox中使用了一段时间,但随后他们开始遵循这个方法。外部资源需要发送Google Chrome和Firefox之前未检查的
内容处置
的标题

PHP代理下载

我知道我可以让一个PHP脚本向外部资源发出请求,然后将其交付给最终用户,同时更改标题和名称以满足我的需要。问题是该网站的流量很高,每个用户下载大约1-2GB的数据。我的服务器无法处理这种类型的流量,升级服务器的成本可能太高

使用外部应用程序重命名文件

我正在考虑使用一个外部应用程序(可能是一个Chrome/Firefox扩展),在文件下载完成后将其重命名。但考虑到我的受众中有足够多的人是一次性访客,要求他们下载应用程序或扩展是不太可能的

闪存或Java嵌入式解决方案

我正在考虑使用Java或Flash嵌入式文件来处理文件下载,但我对这两种平台都知之甚少。据我所知,Flash无法控制用户的文件系统,因此这可能是一个问题。Java将能够完成这项任务,但我真的希望我不必使用Java,因为它通常不安全,需要大量下载才能安装(与外部软件idea的问题相同)



如果您对我能做些什么来解决这个问题有任何想法,我们将不胜感激。我不是在寻找任何代码,只是关于如何完成上述任务的想法。我要感谢你们所有人的时间和专业知识

您所指的外部资源是什么

如果它恰好是Amazon的S3,它允许您生成下载URL,并指定下载时服务器响应中应该出现的URL。在那里,您可以对浏览器在保存文件时应使用的文件名进行编码


如果它是另一项服务,请查看其文档,可能它具有类似的功能。

如果您通过访问控制允许源站在目标服务器上进行身份验证,则这两种方法的结合可能会帮助您:

$.post('/create_binary_file.php',postData,函数(retData){
$(“正文”)。追加(“”);
}); 
使用标记“a”的“下载”属性



这应该适用于最新的Chrome和Firefox,但不适用于IE。

我会投票结束这个问题,因为它主要基于观点;这个问题的答案不会解决问题,他们只会给你和将来发现这个问题的人更多的东西去思考。不幸的是,它有一个公开的悬赏,因此不能投票决定是否结束。我不是在问解决方案1是否比解决方案2好。我目前想到的所有可用解决方案都不起作用。我正在寻找一个解决方案,而不是对我应该使用什么解决方案的意见,因为目前没有。用户是“随机”下载文件(由他们自己选择,我想要文件
foo
bar
,我现在不关心其余的),还是必须下载文件/资源
a
B
C
来完成他们可以在以后使用的某种“包”?(所以基本上是列出一个文件列表,然后将它们全部d/l)他们正在选择要下载的文件,但通常是一系列文件。它们是分为多个片段的视频。一些用户只需要文件4,5,6,而另一些用户可能需要文件1,2,3,4,5,6,…我想说的是,如果您想保留信息,使用桌面语言(例如c#)和构建下载管理器应用程序会更好(在服务器上不加载下载),它可以将信息发送到您的服务器,唯一的缺点是,用户必须使用你的应用程序访问系统才能获取数据。这在Chrome或Firefox中都不起作用了。如果你能提供一个有效的例子,那么我会接受。这是我的例子,它不在Chrome36-oops中工作,我再次检查了文档,在上,下载仅适用于blob:URL或data:URL。所以我想通过XMLHttpRequest将url作为二进制数据加载,然后通过url.createObjectURL转换为数据url,但我遇到了跨域问题。所以,我很抱歉,这看起来是一个不可能完成的任务。
$.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))
    }
});
$.post('/create_binary_file.php', postData, function(retData) {
  $("body").append("<iframe src='" + retData.url+ "' style='display: none;' ></iframe>");
}); 
<a href="http://external.server/path/to/file" download="name_you_want.ext">download</a>