2

Je suis en train de télécharger une photo sur Facebook à partir d'une application Windows Phone Silverlight en utilisant l'API Facebook Graph, mais je reçois une erreur: (# 324) Nécessite un fichier de téléchargement. Quelqu'un peut-il voir quelque chose de mal dans mon code?Facebook Photo Upload pour 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); 
    } 
} 

Répondre

0

Essayez d'indiquer un nom de « source » ainsi qu'un nom de fichier dans l'en-tête Content-Disposition, à savoir

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

Merci pour la suggestion. Je l'ai juste essayé mais j'ai obtenu le même résultat. –

+0

Votre limite est également erronée. Tous sauf le dernier devrait utiliser un format de '" - {0} \ r "' au lieu de juste "{0} \ n" '; le dernier devrait être '" - {0} - \ r "'. – Anomie

+0

la chaîne de délimitation a déjà des traits d'union: var boundary = "--------------------------- 7db3d9202a1"; Je peux réparer le dernier et essayer à nouveau. –

0

Ok, je me suis trompé la première fois, mais maintenant je l'ai .

Le premier problème, dont nous avons déjà traité ci-dessus, était que vous manquiez le "-" avant chaque limite et le "-" après la dernière limite dans le corps POST.

Le deuxième problème est que vous ne laissez pas une ligne vide après les en-têtes MIME avant d'écrire le contenu de l'image. Le troisième problème est que vous ne videz pas le writer avant d'écrire les données de l'image dans son flux sous-jacent (sauf si silverlight sur un téléphone est différent du .NET normal dans StreamWriters à rinçage automatique).

Pour résumer, cela devrait fonctionner:

  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

Malheureusement, ce n'est pas le cas; même erreur. –

+0

Aucune idée alors, ça marche pour moi quand je mets ton code dans un projet et fais le changement ci-dessus. – Anomie

+0

Anomie, télécharge-t-il et affiche l'image sur ton profil Facebook? –