2011-02-28 46 views
2

我正在嘗試使用Facebook Graph API從Windows Phone Silverlight應用程序上傳照片到Facebook,但出現錯誤:(#324)需要上傳文件。任何人都可以在我的代碼中看到任何錯C#中的Facebook照片上傳?

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} \ r」'而不是「{0} \ n」';最後應該是'「 - {0} - \ r」'。 – Anomie

+0

邊界字符串aleady具有連字符:var boundary =「--------------------------- 7db3d9202a1」;我可以修復最後一個,然後重試。 –

0

好吧,我錯了第一次,但現在我有它。

第一個問題,我們已經採取了以上的護理,是你錯過了「 - 」每個邊界和前「 - 」在POST正文最後的邊界之後。

第二個問題是,在寫入圖像內容之前,您沒有在MIME頭後留空行。

第三個問題是,在將圖像數據寫入其基礎流之前(例如,除非手機上的silverlight與自動刷新StreamWriters中的普通.NET不同),否則不會刷新writer

綜上所述,這應該工作:

  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個人資料上顯示圖片? –