2011-02-17 15 views
2


私の取得/投稿にRestSharpを使用しているWindows Phone 7アプリケーションのREST APIに写真をアップロードしようとしています。次のように
ポストパラメータは、REST Windows Phone写真のアップロード

写真: をphoto_album_id
マルチパート/フォームデータとしてエンコード写真:イベントであってもよいし、既存のフォトアルバムの 識別子グループ アルバム

私は私の要求を作成しましたが、毎回、私は戻って"{\"details\":\"missing photo parameter\",\"problem\":\"The API request is malformed\"}\n

を取得

マイフォトパラメータは、次のようになります。

「--------------------------- 8cd9bfbafb3ca00 \ rを\ nContent-処分:フォームデータ。名前= \ "ファイル名\";ファイル名= \ "somefile.jpg \" \ r \ nContent-Type:image/jpg \ r \ n \ r \ n(ここにリストされたバイナリジャンク)\ r \ n ------------ ----------------- 8cd9bfbafb3ca00-- "

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

I 'できるだけシンプルにしようとすると、すべての仕組みが分かればリファクタリングすることができます。

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

答えて

2

Hammock for Windows Phoneはこれを本当に簡単にします。 AddFileメソッドを使用してリクエストにファイルを追加し、写真ストリームを渡すだけです。 - 写真、マルチパート/フォームデータとしてエンコード写真:私が見た

 var request = new RestRequest("photo", WebMethod.Post); 
     request.AddParameter("photo_album_id", _album.album_id); 
     request.AddFile("photo", filename, e.ChosenPhoto); 
+1

RestSharpにはrequest.AddFile()もあります。しかしハンモックは素晴らしい図書館でもあります。私はあなたの問題を解決してうれしいです –

+0

知っておいてよかったです。ありがとう。ハンモックには、スイッチの主要な要素であった大きなオウトサポートがあります。私は本当にレストシャープも好きです。クールなlibsを利用できるようになるのは素晴らしいことです。 – earthling

0

HumはあなたのPostFormが正しいと確信していますか? content- * paramsはあなたのPOSTのヘッダーに設定され、本文には設定されませんか?

var request = (HttpWebRequest)WebRequest.Create(url); 
request.Headers.Add(HttpRequestHeader.Authorization,"blabla"); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
+0

すべての例では、だから何私は混乱していると、この写真のパラメータであり、あなたが示唆されているものに似ています。私はもともと、写真パラメータの内容をバイナリデータに設定するだけで、同じ不正なデータエラーを受け取りました。 – earthling

関連する問題