2012-04-25 12 views
1

SilverlightクライアントからサーバーにWCFサービスを使用して写真をアップロードしようとしています。SilverlightからWCFへの画像ファイル

クライアントによって呼び出されるメソッドは、void UpdatePicture(Stream image)です。クライアント側 この方法は、UpdatePicture(バイト[]配列)として現れるので、私は、コンバータを作成した(入力ストリーム)OpenFileDialog.File.OpenRead(からのFileStreamである)

private byte[] StreamToByteArray(Stream stream) 
    { 
     byte[] array = new byte[stream.Length]; 
     stream.Read(array, 0, array.Length); 
     return array; 
    } 

コンバータはいるようですうまくできた。

WCF側では、ストリームをファイルに保存する必要があります。私はこれを使用して、FileStreamをにストリームをコピーする

public void UpdatePicture(Stream image) 
    { 
     if (SelectedUser == null) 
      return; 
     if (File.Exists(image_path + SelectedUser.sAMAccountName + ".jpg")) 
     { 
      File.Delete(image_path + SelectedUser.sAMAccountName + ".jpg"); 
     } 

     using (FileStream file = File.Create(image_path + SelectedUser.sAMAccountName + ".jpg")) 
     { 
      DataManagement.CopyStream(image, file); 
     } 
    } 

:私はこれを使用

public static void CopyStream(Stream input, Stream output) 
    { 
     byte[] buffer = new byte[8 * 1024]; 
     int len; 
     while ((len = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      output.Write(buffer, 0, len); 
     } 
    } 

予想通りにファイルが作成され、サイズはokですが、画像はで表示されませんPhotoViewerの他のプログラム。

なぜ誰かが知っていますか?すべてのヘルプは非常に高く評価されるだろう:)

EDIT:本当に奇妙な

何か:

私は何もしないで、パラメータを返すWCFメソッドGetWCFBytes(バイト[]配列)を作成しました。 StreamToByteArrayを使用してストリームをこのメソッドにバイト配列として渡し、その結果をMemoryStreamを使用してBitmapImage経由でImageに設定すると、空のイメージが表示されます。

OpenFileDialogのストリームをバイト配列に変換し、この配列から新しいMemoryStreamを作成し、BitmapImageを設定します。画像はokです。

WCFはストリームとバイト配列に対していくつかの魔法を使用しますか?

答えて

1

あなたのCopyStreamメソッドは、それ以上何も得られなくなるまで入力ストリームから読み続けるようにします。 StreamToByteArrayメソッドはありません。最初のxバイトの後にゼロが続くのではなく、クライアント全体のストリームを変換していますか?

private byte[] StreamToByteArray(Stream stream) 
{ 
    byte[] array = new byte[stream.Length]; 
    int index = 0, length = 0; 
    while ((length = stream.Read(array, index, array.Length - index)) > 0) 
    { 
     index += length; 
    } 

    return array; 
} 
+0

回答ありがとうございますが、残念ながら問題は解決しません。 while + readを使用するかどうかに関係なく、ファイルのサイズは同じです。 バイト配列をストリームに変換して戻すと、BItmapImageでそれを使用することができ、Imageコントロールに正しく表示されるので、このメソッドは問題ありません。 私は、サーバー側で何かが間違っていると思います。 –

0

私は答えを見つけましたが、それはWCFとは関係ありませんでした。

問題は、自分のViewModelの[確認]ボタンでOpenFileDialogの結果を変換することです。 なぜか分かりませんが、openfiledialogを呼び出したメソッドで変換を行うと、バイト配列が破損せず、すべて正常に動作します。

ありがとうございました。

関連する問題