3

Windows Phone から Azure Web ロールでホストされている WCF API に要求を送信するアプリを正常に作成しました。RestSharp を使用してこれを行うには、安らかな POST メソッドを使用しています。それはすべて見事に機能し、画像はストレージに表示されますが、画像は通常の画像ファイルとして開かれません.

それらを以前にアップロードした他の画像と比較すると、メタデータ情報では、表示できない画像には 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、上記の 2 番目の 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 に保存したときに) イメージ ファイルとして表示されませんでした。

サーバー側でhttp://multipartparser.codeplex.com/にある MultipartParser クラスを使用して、リクエストをファイル名とファイルストリームのチャンクに解析することで、これを修正しました。次に、通常のプロセスを使用して、この byte[] から画像を保存しました。

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 に答える