2012-02-26 75 views
4

我正在研究一个文件上传系统,它将在多台服务器上存储大文件的各个部分。因此,一个1GB的文件的分布将是这个样子:下载一个文件,存储在多台服务器上的文件(HTTP)

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下载

我不确定我的例子是否有效,因为我还没有测试过它。我很好奇,如果有其他解决方案可能有?

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

据我所知,没有JavaScript解决方案一个文件,如果有一个,那将是伟大的。

回答

2

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

1

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

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

+0

re:同源,请参阅JSONP – Greg 2012-02-26 23:06:00

2

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

该解决方案存储在内存中的文件了,所以它不适用于非常大的文件。

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

+0

这真是一件非常酷的事,我很喜欢它;但是,它不适用于我正在处理的文件大小(100MB +)。尽管如此,谢谢。 – GoldenNewby 2012-02-26 22:38:54

1

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

您可以使用XHR2CORS下载的文件块为ArrayBuffer秒,然后用Blob构造进行合并使用createObjectURL到合并后的文件发送给用户。

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

相关问题