2011-02-28 16 views
2

Facebook Graph APIを使用してWindows Phone SilverlightアプリケーションからFacebookに写真をアップロードしようとしていますが、エラーが発生しています:(#324)アップロードファイルが必要です。誰も私のコードで何かが間違って見ることができますか?Facebook Photo Upload in C#?

internal void PublishPhoto(System.IO.MemoryStream stream, string message, string accessToken) 
    { 
     var requestUriString = string.Format(
      CultureInfo.InvariantCulture, 
      "https://graph.facebook.com/{0}/photos?access_token={1}&message={2}", 
      "me", 
      accessToken, 
      message); 

     var webRequest = WebRequest.CreateHttp(requestUriString); 

     webRequest.Method = "POST"; 

     var boundary = "7db3d9202a1"; 
     webRequest.ContentType = string.Format("multipart/form-data; boundary={0}", boundary); 

     webRequest.BeginGetRequestStream(new AsyncCallback(delegate (IAsyncResult result) 
      { 
       GetRequestStream(stream, boundary, result); 

       BeginGetResponse(webRequest); 

      }), webRequest); 
    } 

    private static void GetRequestStream(System.IO.MemoryStream imageStream, string boundary, IAsyncResult result) 
    { 
     var webRequest2 = result.AsyncState as HttpWebRequest; 

     using (var requestStream = webRequest2.EndGetRequestStream(result)) 
     { 
      using (StreamWriter writer = new StreamWriter(requestStream)) 
      { 
       writer.WriteLine("--{0}\r", boundary); 
       writer.WriteLine("Content-Disposition: form-data; filename=\"sketch.jpg\"\r"); 
       writer.WriteLine("Content-Type: image/jpg\r"); 

       byte[] buffer = imageStream.GetBuffer(); 
       requestStream.Write(buffer, 0, buffer.Length); 

       writer.WriteLine("\r"); 
       writer.WriteLine("--{0}--\r", boundary); 
      } 

      imageStream.Close(); 
     } 
    } 

    private static void BeginGetResponse(HttpWebRequest webRequest) 
    { 
     webRequest.BeginGetResponse(new AsyncCallback(delegate(IAsyncResult result2) 
     { 
      var webRequest2 = result2.AsyncState as HttpWebRequest; 

      try 
      { 
       using (var response = webRequest2.EndGetResponse(result2)) 
       { 
        using (var responseStream = response.GetResponseStream()) 
        { 
         using (StreamReader reader = new StreamReader(responseStream)) 
         { 
          System.Diagnostics.Debug.WriteLine(reader.ReadToEnd()); 
         } 
        } 
       } 
      } 
      catch (WebException we) 
      { 
       System.Diagnostics.Debug.WriteLine(we.Message); 

       using (var responseStream = we.Response.GetResponseStream()) 
       { 
        using (StreamReader reader = new StreamReader(responseStream)) 
        { 
         var errorJson = reader.ReadToEnd(); 

         var response = Newtonsoft.Json.JsonConvert.DeserializeObject<FacebookErrorResponse>(errorJson); 

         System.Diagnostics.Debug.WriteLine("Could not upload image to Facebook: {0}", response.Error.Message); 
        } 
       } 
      } 
     }), webRequest); 
    } 
} 

答えて

0

すなわち

writer.WriteLine("Content-Disposition: form-data; name=\"source\"; filename=\"sketch.jpg\"\r"); 
+0

感謝を。私はちょうどそれを試みたが、同じ結果を得た。 –

+0

境界も間違っています。最後のものを除くすべては '" {0} \ n "'の代わりに '" - {0} \ r "'の形式を使用する必要があります。最後は '' - {0} - \ r "'でなければなりません。 – Anomie

+0

境界文字列aleadyにハイフンがあります。var boundary = "--------------------------- 7db3d9202a1";私は最後のものを修正して、もう一度やり直すことができます。 –

0

[OK]を、私は最初の頃間違っていたが、今私はそれを持って、「ソース」の名前などのContent-Dispositionヘッダーにファイル名を指定してください。

私たちが既に気を付けていた最初の問題は、POSTボディの最後の境界の後ろに各境界の前に " - "がなくなっていたことでした。

2番目の問題は、イメージの内容を書き込む前に、MIMEヘッダーの後に空白行を残さないことです。

第3の問題は、イメージデータを基本ストリームに書き込む前にwriterをフラッシュしていないことです(電話機のSilverlightが自動フラッシングStreamWritersの通常の.NETと異なる場合を除く)。

まとめると、この作業をする必要があります:提案のための

  writer.WriteLine("--{0}\r", boundary); 
      writer.WriteLine("Content-Disposition: form-data; filename=\"sketch.jpg\"\r"); 
      writer.WriteLine("Content-Type: image/jpg\r"); 
      writer.WriteLine("\r"); 
      writer.Flush(); 

      byte[] buffer = imageStream.GetBuffer(); 
      requestStream.Write(buffer, 0, buffer.Length); 

      writer.WriteLine("\r"); 
      writer.WriteLine("--{0}--\r", boundary); 
+0

残念ながら、それはしませんでした。同じエラー。 –

+0

プロジェクトにコードを入れて上記の変更を行うと、それは私にとってはうってつけです。 – Anomie

+0

Anomie、Facebookのプロフィールに実際に画像をアップロードして表示していますか? –