图像文件从 Silverlight 到 WCF



我正在尝试使用 WCF 服务将照片从 Silverlight 客户端上载到服务器。

客户端调用的方法为 void UpdatePicture(流图像);此方法在客户端显示为 UpdatePicture(byte[] 数组),因此我创建了一个转换器(输入流是来自 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);
        }
    }

要将流复制到文件流,我使用这个:

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 ou 任何其他程序显示。

有人知道为什么吗?任何帮助将不胜感激:)

编辑:

真的很奇怪:

我创建了一个WCF方法GetWCFBytes(byte[]数组),该方法返回参数而不执行任何操作。如果使用 StreamToByteArray 将流作为字节数组传递给此方法,并通过具有 MemoryStream 的 BitmapImage 将结果设置为图像,则它将显示空白图像。

如果我获取OpenFileDialog的流,将其转换为字节数组,从该数组创建一个新的MemoryStream,并使用它设置我的BitmapImage:图像没问题。

WCF 是否对流和字节数组使用一些魔法?

您的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;
}

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

问题是我在视图模型中打开确认按钮时转换了我的 OpenFileDialog 结果。我不知道为什么,但是如果我在称为openfiledialog的方法中进行转换,字节数组不会损坏并且一切正常。

谢谢。

相关内容

  • 没有找到相关文章

最新更新