我正在尝试使用 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 将流作为字节数组传递给此方法,并通过带有 MemoryStream 的 BitmapImage 将结果设置为 Image,则显示空白图像。
如果我采用 OpenFileDialog 的流,将其转换为字节数组,从该数组创建一个新的 MemoryStream,并用它设置我的 BitmapImage:图像没问题。
WCF 是否对流和字节数组使用了一些魔法?