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 はストリームとバイト配列に対していくつかの魔法を使用しますか?