【问题标题】:Download one file, with pieces stored on more than one server (HTTP)下载一个文件,其中的片段存储在多个服务器上 (HTTP)
【发布时间】:2012-02-26 22:12:27
【问题描述】:

我正在开发一个文件上传系统,它将把大文件的各个部分存储在多台服务器上。所以一个 1GB 文件的分布看起来像这样:

Server 1: 0-128MB
Server 2: 128MB-256MB
Server 2: 256MB-384MB
... etc

这样做的目的是考虑到冗余(每个部分将存在于多台服务器上)、安全性(没有一台服务器可以访问整个文件)和成本(分配带宽费用)。

我很好奇是否有人对我如何能够“诱骗”网络浏览器通过一个链接下载各个部分有意见。

我的想法是这样的:

  1. 浏览器链接到服务器 1,它提供完整文件的内容大小
  2. 提供 128MB 后,服务器 1 将有意关闭连接
  3. 希望浏览器会尝试重新启动下载,请求服务器 1
  4. 服务器 1 提供到服务器 2 的 3XX 重定向
  5. 浏览器继续从服务器 2 下载

我不确定我的示例是否有效,因为我尚未对其进行测试。我很好奇是否有人可能有其他解决方案?

我想让整个过程尽可能简单(理想情况下,除了简单的下载之外不需要任何工作)。我不希望用户必须使用另一个程序(即:将文件放在一起)。我也不想使用代理服务器,因为它会产生额外的带宽成本。

据我所知,没有用于编写文件的 javascript 解决方案,如果有的话,那就太好了。

【问题讨论】:

    标签: javascript html http download


    【解决方案1】:

    AFAIK 使用 HTTP 协议是不可能的。您可能可以使用自定义浏览器扩展,但这取决于浏览器。另一种选择是创建一个 Java 小程序,可以从不同的服务器下载文件。小程序可以接受不同服务器的 URL 作为参数。

    【讨论】:

      【解决方案2】:

      保存生成的文件: https://stackoverflow.com/a/4551467/329062

      该解决方案将文件存储在内存中,因此不适用于非常大的文件。

      您可以使用 JSONP 将部分文件下载到 JS 变量中。这也可以让您绕过同源策略。

      【讨论】:

      • 这是一个非常酷的技巧,我真的很喜欢它;但是,它不适用于我正在处理的文件大小(100MB+)。很棒的发现,谢谢。
      【解决方案3】:

      Javascripts 安全模型只允许您访问来自 Javascript 来源的同一来源的数据 - 即不是多个服务器。

      如果您要在多台服务器上保存文件位,您将需要用户加载网页,获取位,然后最后以正确的顺序将这些位粘在一起。如果你能设法让你的所有用户(正确地)这样做,那么你就是一个比我更好的人。

      【讨论】:

        【解决方案4】:

        在现代浏览器中可以通过标准 HTTP 进行操作。

        您可以使用XHR2CORS 将文件块下载为ArrayBuffers,然后使用Blob 构造函数合并它们,并使用createObjectURL 将合并后的文件发送给用户。

        但是,我怀疑浏览器会将这些对象存储在 RAM 中,因此将其用于大文件可能不是一个好主意。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 1970-01-01
          相关资源
          最近更新 更多