2009-12-06 6 views
5

大きなファイルをサーバーにアップロードする必要のあるSilverlightアプリケーションがあります。私はWebClientとHttpWebRequestの両方を使ってアップロードを見てきましたが、どちらのオプションでもストリームをアップロードする方法は分かりません。 uplaodingが合理的でないうちに、内容全体をメモリにロードしてファイルのサイズにしてください。これはSilverlightでも可能ですか?Silverlightストリーミングアップロード

+0

+1本当に良い質問ですが、私は良い答えがあったと思います。ファイルの大きさはどのくらいですか? – AnthonyWJones

+0

最大150メガ程度のwavファイルがあります – herbrandson

答えて

1

あなたは「チャンク」の方法で行くことができます。 CodePlexに上のSilverlightのファイルアップローダは、この技術を使用しています:チャンクサイズを考えると

http://www.codeplex.com/SilverlightFileUpld

(例えば、10K、20K、100K、など)は、ファイルを分割し、HTTPを使用してサーバーに各チャンクを送信することができます要求。サーバーは各チャンクを処理し、各チャンクが到着するとファイルを再アセンブルする必要があります。複数のWebサーバーがあるWebファームのシナリオでは、Webサーバー上のローカルファイルシステムをこの方法に使用しないように注意してください。

+0

「チャンク'(WCFのように)サーバー側で再アセンブルしますか? – atconway

+1

私は2つのテクニックを使いました:1)各チャンクをファイルシステム上のファイルとして保存し、すべてのチャンクが書き込まれた後に適切な順序でファイルを再アセンブルし、2)各チャンクをバイナリデータとして保存するデータベースを作成して再アセンブルします。あなたのサイトが複数のWebサーバー間で負荷分散されている場合は、テクニック#2またはある種の分散ファイルシステムを使用する必要があります。 – kindohm

+0

私のファイルシステムの場所は、WCFサーバーが存在するサーバーと同じサーバー上にあり、負荷分散サーバーではないため、#1は本当にうまくいくと思います。チャンクを書き、再組み立てする例はありますか?どのような種類のリーダー/ライターを使用しますか?助けてくれてありがとう。 – atconway

1

SilverlightのWebClientが、進行状況イベントでサーバーにStreamをポンピングする手段を提供できないことは、特別なことです。これは文字列のアップロードのために提供されて以来、特に驚くべきことです!

HttpWebRequestを使用して何をしているように見えるのかを記述することは可能です。

BeginGetRequestStreamのコールバックでは、発信要求のストリームを取得し、ファイルのストリームからチャンクを読み込んで出力ストリームに書き込むことができます。残念ながら、Silverlightは、出力ストリームが閉じられるまで、出力をサーバーに送信しません。このデータがすべて保存されている間は、私は分かりません。十分に大きくなると、一時的なファイルを使用してマシンのメモリに負荷をかけないようにすることができますが、とにかく

可能な可能性がある唯一の解決策は、ソケット経由でHTTPプロトコルを書き込むことです。

+0

ソケットについては少ししか問題がありません。Silverlightソケットはポート80(4502〜4534のみ)に接続できません。 – herbrandson

関連する問題