1

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

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

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

コンバーターはうまく機能しているようです。

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

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);
        }
    }

Stream を FileStream にコピーするには、これを使用します。

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);
        }
    }

ファイルは期待どおりに作成され、サイズは問題ありませんが、PhotoViewer や他のプログラムで画像が表示されません。

誰かが理由を知っていますか?どんな助けでも大歓迎です:)

編集 :

本当に奇妙なこと:

何もせずにパラメーターを返す WCF メソッド GetWCFBytes(byte[] array) を作成しました。StreamToByteArray を使用してこのメ​​ソッドにストリームをバイト配列として渡し、その結果を BitmapImage と MemoryStream を介して Image に設定すると、空白の画像が表示されます。

OpenFileDialog のストリームを取得し、それをバイト配列に変換し、この配列から新しい MemoryStream を作成し、それを使用して BitmapImage を設定すると、画像は問題ありません。

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

4

2 に答える 2

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;
}
于 2012-04-25T11:54:50.467 に答える
0

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

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

ありがとう。

于 2012-04-25T15:04:57.817 に答える