2


Gets/Posts に RestSharp を使用して、Windows Phone 7 アプリケーションの REST API に写真をアップロードしようとしています。
投稿パラメーターは次のとおりです。

photo : multipart/form-data としてエンコードされた写真
photo_album_id : 既存のフォト アルバムの識別子。イベントまたはグループ アルバムの場合があります。

リクエストを作成しましたが、戻ってくるたびに"{\"details\":\"missing photo parameter\",\"problem\":\"The API request is malformed\"}\n

私の写真パラメータは次のようになります。

"---------------------------8cd9bfbafb3ca00\r\nContent-Disposition: フォームデータ; name=\"filename\"; filename= \"somefile.jpg\"\r\nContent-Type: image/jpg\r\n\r\n(いくつかのバイナリジャンクがここにリストされています)\r\n-------------- ---------------8cd9bfbafb3ca00--"

画像のバイナリ データを表示する方法に問題があるかどうかはよくわかりません (現在、PhotoTaskCompleted イベントで、e.ChosenPhoto の内容をバイト [] に読み取り、それをヘルパー メソッドに渡します。フォームデータを作成する) またはフォームを正しく作成しない場合。

私はこれをできるだけ単純にしようとしているだけで、すべてがどのように機能するかがわかったらリファクタリングできます。

 void ImageObtained(object sender, PhotoResult e)
    {

        var photo = ReadToEnd(e.ChosenPhoto);
        var form = PostForm(photo);
        var request = new RequestWrapper("photo", Method.POST);
        request.AddParameter("photo_album_id", _album.album_id);
        request.AddParameter("photo", form);

        request.Client.ExecuteAsync<object>(request, (response) =>
          {
               var s = response.Data;
          });
    }

    private string CreateBoundary()
    {
        return "---------------------------" + DateTime.Now.Ticks.ToString("x");

    }

    private string PostForm(byte[] data)
    {
        string boundary = CreateBoundary();
        StringBuilder post = new StringBuilder();
        post.Append(boundary);
        post.Append("\r\n");
        post.Append("Content-Disposition: form-data; name=\"filename\"; filename=\"somefile.jpg\"");
        post.Append("\r\n");
        post.Append("Content-Type: image/jpg");
        post.Append("\r\n\r\n");
        post.Append(ConvertBytesToString(data));
        post.Append("\r\n");
        post.Append("--");
        post.Append(boundary);
        post.Append("--");

        return post.ToString();
    }

    public static string ConvertBytesToString(byte[] bytes)
    {
        string output = String.Empty;
        MemoryStream stream = new MemoryStream(bytes);
        stream.Position = 0;
        using (StreamReader reader = new StreamReader(stream))
        {
            output = reader.ReadToEnd();
        }

        return output;
    }
4

2 に答える 2

2

Windows Phone用のハンモックは、これを非常に簡単にします。メソッドを使用してファイルをリクエストに追加しAddFile、フォトストリームを渡すだけです。

        var request = new RestRequest("photo", WebMethod.Post);
        request.AddParameter("photo_album_id", _album.album_id);
        request.AddFile("photo", filename, e.ChosenPhoto);
于 2011-02-21T06:42:01.220 に答える
0

あなたのPostFormが正しいと確信していますか?content-* パラメータは、本文ではなく、POST のヘッダーに設定する必要があります。

var request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.Authorization,"blabla");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
于 2011-02-17T23:32:06.940 に答える