2012-02-26 77 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中,因此將它用於大文件可能是一個壞主意。

相關問題