3

我已成功制作了一个应用程序,该应用程序将来自我的 Windows Phone 的请求发送到托管在 azure Web 角色中的 WCF api。我正在使用 Restful POST 方法使用 RestSharp 来执行此操作。这一切都很好,图像出现在存储中,但图像没有像普通图像文件一样打开。

将它们与我之前上传的其他图像进行比较,在元数据信息中它说不可见的图像有一个 contentMD5 字段,该字段设置为“AKEYWqGgulwi6/9/VY2KPg==”(而其他人没有)这可能是导致的文件的问题?

我附上了我的 RestSharp 代码,也许我正在添加一些我不应该添加的东西?我怀疑的错误一定来自这里,因为这是操纵图像流的唯一地方。

   public void SendRequest(Stream imageStream, string imageID)
    {
        var client = new RestClient();
        client.BaseUrl = apiAddress;
        var request = new RestRequest("agerecog/{imageName}", Method.POST);
        request.AddUrlSegment("imageName", imageID);

        //convert imagestream to byte array
        var byteArray = new byte[imageStream.Length];
        imageStream.Read(byteArray, 0, (int)imageStream.Length);

        //add byteArray to request
        request.AddFile("image/jpeg", byteArray, imageID);
        var url = client.BuildUri(request).ToString();
        client.ExecuteAsync<VizageResponse>(request, response =>
            {
                //request info. to be added here
            });
    }

编辑#1 经过一番工作,我决定将 addFile 行更改为:

  request.AddFile(null, byteArray, null);

这改变了流的长度,也使 contentMD5 字段为空。但是,该图像仍然不是有效的图像文件。鉴于我要比较的图像都来自 Windows Phone 模拟器,它们都应该是相同的白页,角落有一个黑色的小方块 - 但文件之间的大小不同(有效图像文件的长度为 5670 ,原始代码长度为 6076,使用上面的第二个 addFile 长度为 6239)

编辑#2 做更多的分析,当图像流被发送之前,它的长度属性是 6116,当它到达服务器时,它是 6370。264 是从我相信的 RestSharp 方法中的某个地方添加的,或者当流数据在服务器端进行解释。WCF服务的代码:

  [WebInvoke(UriTemplate = "/agerecog/{imageName}", Method = "POST")]
    VizageResult analyseFace(string imageName, Stream imageStream);
4

2 回答 2

3

问题解决了

我终于解决了这个问题,最终结果是可以看到图像。发生的事情是 imageStream 还包含有关文件名称的数据,这导致它(当保存在 Azure 中时)不显示为图像文件。

我通过使用此处找到的 MultipartParser 类解决了这个问题:http: //multipartparser.codeplex.com/在服务器端将请求解析为文件名和文件流块。然后我使用正常过程从这个字节 [] 中保存了图像。

我将 webrequest 数据解析为其组成部分的代码如下:

    MemoryStream imageStream = new MemoryStream();

     MultipartParser parser = new MultipartParser(dataStream);
        if (parser != null && parser.Success)
        {
            imageName = parser.Filename;
            imageStream.Write(parser.FileContents, 0, parser.FileContents.Length);
        }

当您使用内存流时,请记住将其位置设置回 0 - 我犯了一个小学生错误!

于 2012-04-25T21:14:32.487 回答
0

我不是很熟悉 RestSharp。你能确定MD5是正确的吗?尝试将 blob 中的数据与原始图像文件中的数据进行比较。例如,检查它们是否具有相同的大小,第一个/最后几个字节是否相同(并假设中间的字节也相同)。

于 2012-04-25T07:40:30.450 回答