2009-10-25 18 views
7

Silverlightで非常にサンプルのファイルアップロードコードスニペット/ソリューションを探しています。検索を行った後、私は多数のコントロール/プロジェクトを見つけましたが、それらのすべてはかなり複雑でした。複数のファイルのアップロード、ファイルのアップロードの進行、イメージの再サンプリング、および多くのクラスをサポートします。非常に単純なSilverlightファイルアップロードの例

私は、シンプルなシナリオを短く、クリーンでわかりやすいコードで探しています。

答えて

13

このコードはかなり短いと理解することが(たぶん)簡単です:

public const int CHUNK_SIZE = 4096; 
public const string UPLOAD_URI = "http://localhost:55087/FileUpload.ashx?filename={0}&append={1}"; 
private Stream _data; 
private string _fileName; 
private long 
_bytesTotal; 
private long _bytesUploaded; 
private void UploadFileChunk() 
{ 
    string uploadUri = ""; // Format the upload URI according to wether the it's the first chunk of the file 
    if (_bytesUploaded == 0) 
    { 
     uploadUri = String.Format(UPLOAD_URI,_fileName,0); // Dont't append 
    } 
    else if (_bytesUploaded < _bytesTotal) 
    { 
     uploadUri = String.Format(UPLOAD_URI, _fileName, 1); // append 
    } 
    else 
    { 
     return; // Upload finished 
    } 

    byte[] fileContent = new byte[CHUNK_SIZE]; 
    _data.Read(fileContent, 0, CHUNK_SIZE); 

    WebClient wc = new WebClient(); 
    wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted); 
    Uri u = new Uri(uploadUri); 
    wc.OpenWriteAsync(u, null, fileContent); 
    _bytesUploaded += fileContent.Length; 
} 

void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) 
{ 
    if (e.Error == null) 
    { 
     object[] objArr = e.UserState as object[]; 
     byte[] fileContent = objArr[0] as byte[]; 
     int bytesRead = Convert.ToInt32(objArr[1]); 
     Stream outputStream = e.Result; 
     outputStream.Write(fileContent, 0, bytesRead); 
     outputStream.Close(); 
     if (_bytesUploaded < _bytesTotal) 
     { 
      UploadFileChunk(); 
     } 
     else 
     { 
      // Upload complete 
     } 
    } 
} 

完全にダウンロードソリューションについては、この上の私のブログの記事を参照してください。File Upload in Silverlight - a Simple Solution

+0

リンクありがとうございます! – JohnC

+2

今後、この回答を見る人のために、ここではUploadFileAsyncまたはUploadDataAsyncがおそらく適切でしょう。 OpenWriteAsyncはストリームの書き込みには最適ですが、fileContentのようなバイト配列を引数として取り上げてアップロードしません。 OpenWriteCompletedEventHandlerは、「アップロードが完了しました」ではなく、「スチームは書き込み準備ができました」を意味します。 –

+1

注目してくれてありがとう、私はUploadFileAsyncを知らなかった。 SL2でサポートされていなかったことをちょっと調べてみましたが、バージョン3でサポートされているかどうかを調べ、それに応じてコードを更新します。 –

2

は、このプロジェクトhttp://simpleuploader.codeplex.com/をチェックしてください。それは非常に非常に少数のコード行で複数のファイルをあなたのサーバにアップロードすることを可能にします。

関連する問題