2009-12-06 91 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