2009-12-06 115 views
5

我有一個需要上傳大文件到服務器的Silverlight應用程序。我已經看過使用WebClient和HttpWebRequest進行上傳,但是我沒有看到用任何選項流式傳輸上傳的明顯方式。按照文件的大小,在上傳之前將整個內容加載到內存中是不合理的。這在Silverlight中可能嗎?Silverlight流媒體上傳

+0

+1一個非常好的問題,希望我有一個很好的答案。我們在談論多大的文件? – AnthonyWJones 2009-12-06 22:55:52

+0

有wav文件可能高達約150+兆 – herbrandson 2009-12-07 00:05:08

回答

1

你可以用「分塊」的方法去。 CodePlex上,基於Silverlight的文件上傳使用這種技術:

http://www.codeplex.com/SilverlightFileUpld

鑑於塊大小(如10K,20K,100K,等等),你可以分割的文件,並使用HTTP每個塊發送到服務器請求。服務器需要處理每個塊,並在每個塊到達時重新組合文件。在有多個Web服務器的Web場景中 - 請注意不要使用Web服務器上的本地文件系統進行此方法。

+0

如何堅持的「塊任何想法'在服務器端(比如在WCF中)並重新組裝? – atconway 2011-10-04 14:19:14

+1

我已經使用了兩種方法:1)每個塊保存爲文件系統上的文件,因爲它到達,然後重新組裝在正確的順序文件的所有數據塊被寫入後2)保存每個塊存儲爲二進制數據一個數據庫然後重新組裝。如果您的站點在多個Web服務器上進行負載均衡,則需要使用技術#2或某種分佈式文件系統。 – kindohm 2011-10-04 15:33:54

+0

由於我的文件系統位置位於WCF服務器所在的同一臺服務器上,並且它不是一個負載均衡的服務器,所以我認爲#1會很好地工作。你有沒有寫大塊和重組的例子?你會用什麼樣的讀寫器?謝謝您的幫助。 – atconway 2011-10-04 20:13:22

1

它似乎奇特,在Silverlight Web客戶端未能提供泵的流與進度事件服務器的一種手段。它特別令人驚歎,因爲它提供了一個字符串上傳!

是可能的代碼會是什麼似乎做你想要什麼用的HttpWebRequest。

在回調BeginGetRequestStream時,您可以獲取傳出請求的Stream,然後從文件的Stream中讀取塊並將它們寫入輸出流。不幸的是,直到輸出流已關閉,Silverlight纔開始將輸出發送到服務器。在所有這些數據最終都被存儲的同時,我不知道,如果它足夠大,SL可能使用一個臨時文件,以免壓縮機器內存,但它可能只是將其全部存儲在內存中無論如何。

的唯一解決這個可能是可能的是寫通過套接字HTTP協議。

+0

我throught一些關於插槽和問題是,Silverlight的套接字無法連接到端口80(僅4502至4534) – herbrandson 2009-12-10 04:36:53