2009-12-06 22 views
5

Büyük dosyaları sunucuya yüklemesi gereken bir Silverlight uygulamasına sahibim. Hem WebClient hem de bir HttpWebRequest kullanarak yükleme baktım, ancak her iki seçenek ile karşıya yükleme akışı açık bir şekilde görmüyorum. Dosyaların büyüklüğüne geçin, uplaoding işleminden önce tüm içeriği belleğe yüklemek mantıklı değildir. Silverlight'ta bu mümkün mü?Silverlight streaming upload

+0

+1 Gerçekten güzel bir soru, iyi bir cevabım olsaydı. Ne kadar büyük bir dosyadan bahsediyoruz? – AnthonyWJones

+0

Yaklaşık 150+ mega kadar olabilecek bir wav dosyası var. – herbrandson

cevap

1

"Bölme" yaklaşımıyla devam edebilirsiniz. Codeplex üzerinde Silverlight File Uploader bu tekniği kullanır: Bir yığın boyutu göz önüne alındığında

http://www.codeplex.com/SilverlightFileUpld

(örn 10k, 20k, 100k, vs), dosyayı bölmek ve bir HTTP kullanarak sunucuya her öbek gönderebilir istek. Sunucunun her bir parçayı ele alması ve her bir parça geldiğinde dosyayı yeniden kurması gerekir. Birden çok web sunucusu olduğunda bir web grubu senaryosunda - bu yaklaşım için web sunucusundaki yerel dosya sistemini kullanmamaya dikkat edin.

+0

'Chunks' in nasıl devam edeceğine dair herhangi bir fikir 'sunucu tarafında (WCF'de) ve yeniden monte edin? – atconway

+1

İki teknik kullandım: 1) her bir dosyayı dosya sistemine geldiğinde dosya olarak kaydedin, sonra tüm parçaları yazdıktan sonra dosyaları uygun sırayla yeniden birleştirin ve 2) her bir parçayı ikili veri olarak kaydedin bir veritabanı ve daha sonra yeniden bir araya getirin. Siteniz birden fazla web sunucusunda yük dengeleniyorsa teknik # 2 veya dağıtılmış dosya sistemini kullanmanız gerekecektir. – kindohm

+0

Dosya sistemimin konumu, WCF sunucusunun bulunduğu sunucuda bulunduğundan ve yük dengeli bir sunucu olmadığından, # 1'in gerçekten iyi çalışacağını düşünüyorum. Parçaların yazılması ve yeniden takılmasıyla ilgili örneklerin var mı? Ne tür bir okuyucu/yazar kullanırdınız? Yardım için teşekkürler. – atconway

1

Silverlight'taki WebClient'in, ilerleme olaylarıyla birlikte sunucuya bir Akışı pompalamak için bir araç sağlamadığı olağanüstü görünüyor. Bu özellikle bir dize yükleme için sunulan şaşırtıcı!

HttpWebRequest ile ne yapmak istediğinizi görünecek şekilde kodlamak mümkündür.

BeginGetRequestStream için geri aramada, giden istek için Akışı alabilirsiniz ve daha sonra dosya akışınızdan gelen parçaları okuyabilir ve çıktı akışına yazabilirsiniz. Ne yazık ki, Silverlight, çıktı akışı kapatılana kadar çıkışı sunucuya göndermeye başlamıyor. Tüm bu verilerin bittiği yerde bittiği zaman, bilmiyorum, eğer yeterince büyük SL alırsa, makinenin belleğini germemek için geçici bir dosya kullanabilir, ancak tekrar bellekte saklayabilir. neyse.

Bunun için mümkün olan tek çözüm, HTTP protokolünü soketler üzerinden yazmaktır.

+0

Soketler hakkında biraz konuştum ve sorun, Silverlight soketlerinin bağlantı noktası 80'e bağlanamaması (sadece 4502'den 4534'e) – herbrandson