从 Silverlight 到 WCF 的图像文件

Posted

技术标签:

【中文标题】从 Silverlight 到 WCF 的图像文件【英文标题】:Image file from Silverlight to WCF 【发布时间】:2012-05-06 00:38:31 【问题描述】:

我正在尝试使用 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 是否对流和字节数组使用了一些魔法?

【问题讨论】:

【参考方案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;

【讨论】:

感谢您的回答,不幸的是它并没有解决问题。无论我是否使用 while + Read,文件的大小都相同。我认为这种方法是可以的,因为如果我将字节数组转换回流,我仍然可以在 BItmapImage 中使用它并且它在 Image 控件中正确显示。所以我认为服务器端出了点问题。【参考方案2】:

我找到了答案,它确实与 WCF 无关!

问题是我在 ViewModel 中的确认按钮上转换了 OpenFileDialog 结果。 我不知道为什么,但是如果我在调用 openfiledialog 的方法中进行转换,字节数组不会损坏并且一切正常。

谢谢。

【讨论】:

以上是关于从 Silverlight 到 WCF 的图像文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WCF 调用从客户端 windows phone 8.0 silverlight 返回对象的方法

●创建silverlight+wcf

ssl、silverlight、wcf 和本地安装

Silverlight 到 WCF 跨域异常,但正在成功读取 clientaccesspolicy.xml

WCF Silverlight 跨域问题

silverlight 应用程序不能使用 wcf 命名空间