【问题标题】:Download External Resource - Rename File下载外部资源 - 重命名文件
【发布时间】:2014-07-19 03:17:16
【问题描述】:

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

我正在寻找获得它的方法,以便浏览器以不同的名称下载文件。以下是我的一些想法以及为什么它们不起作用,但您也许可以找到解决方法。

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

下载属性

这种方法在 Google Chrome 和 Firefox 中运行了一段时间,但后来他们开始关注W3 HTML5 spec。外部资源需要发送Content-Disposition的标头,其中谷歌浏览器和火狐浏览器之前没有检查。

PHP 代理下载

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

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

我正在考虑使用一个外部应用程序(可能是 Chrome / Firefox 扩展程序),它会在文件完成下载后重命名文件。但考虑到我的足够多的受众是一次性访问者,要求他们下载应用程序或扩展程序的可能性很小。

Flash 或 Java 嵌入式解决方案

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


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

【问题讨论】:

  • 我会投票结束这个问题,因为它主要是基于意见的;这个问题的答案并不能解决问题,它们只会给你和将来发现这个问题的人提供更多思考的东西。不幸的是,它有一个开放的赏金,因此不能投票结束。
  • 我不是在问解决方案 1 是否比解决方案 2 更好。我目前想到的所有可用解决方案都行不通。我正在寻找我遇到的问题的解决方案,而不是对我应该使用什么解决方案的意见,因为目前没有。
  • 用户是否“随机”下载文件(由他们自己选择,我要文件foo和bar,我现在不关心其他的了 ),或者他们是否必须下载文件/资源​​A、B 和C 才能完成某种之后可以使用的“包”? (所以基本上处理一个文件列表并将它们全部删除)
  • 他们正在选择要下载的文件,但通常是一系列文件。它们是分割成片段的视频。有些用户只想要文件 4,5,6,而其他用户可能想要 1,2,3,4,5,6,...
  • 如果你想保留它可以发送到的信息,我会说你使用桌面语言 E.G c# 并构建一个下载管理器应用程序会更好(不加载服务器进行下载)您的服务器,唯一的缺点是用户必须使用您的应用程序访问系统才能获取数据。

标签: javascript php html


【解决方案1】:

您指的这个外部资源是什么?

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

如果是其他服务,看看它的文档,也许它有类似的功能。

【讨论】:

    【解决方案2】:

    如果您通过 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>");
    }); 
    

    【讨论】:

      【解决方案3】:

      使用标签“a”的“下载”属性。

      <a href="http://external.server/path/to/file" download="name_you_want.ext">download</a>
      

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

      【讨论】:

      • 这甚至不再在 Chrome 或 Firefox 中工作了。如果你能提供一个可行的例子,那么我会接受这个。这是我在 Chrome 36 中无法使用的示例 - jsfiddle.net/4AX42
      • 哎呀,我再次检查了文档,在developer.mozilla.org/en-US/docs/Web/HTML/Element/a,下载仅适用于 blob:URLs 或 data:URLs。所以我想通过 XMLHttpRequest 将 url 作为二进制数据加载,然后通过 URL.createObjectURL 转换为数据 URL,但是我遇到了跨域问题。所以,这看起来像是一个不可能完成的任务,我很抱歉。
      猜你喜欢
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多