下载一个文件,其中的部分存储在多个服务器上(HTTP)

时间:2012-02-26 22:12:27

标签: javascript html http download

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

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

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

我很好奇是否有人对如何“欺骗”网络浏览器在一个链接中下载各个部分有意见。

我想到的是:

  1. 浏览器链接到服务器1,后者提供完整文件的内容大小
  2. 一旦提供128MB,服务器1将故意关闭连接
  3. 希望浏览器尝试重启下载,请求服务器1
  4. 服务器1提供3XX重定向到服务器2
  5. 浏览器继续从服务器2下载
  6. 我不确定我的示例是否有效,因为我还没有测试过它。如果有人可能有其他解决方案,我很好奇吗?

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

如果要在多个服务器上拥有文件位,则需要用户加载网页,获取该位,然后最终以正确的顺序将这些位粘在一起。如果你能够让所有用户(正确地)做到这一点,那么你就比我更好。

答案 3 :(得分:1)

可以通过标准HTTP在现代浏览器中完成。

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

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