Question


J'essaie de télécharger une photo sur une API REST dans une application Windows Phone 7 en utilisant RestSharp pour mes Gets/Posts.
Les paramètres de publication sont les suivants :

photo:La photo, codée en multipart/form-data
photo_album_id:Identifiant d'un album photo existant, qui peut être un événement ou un album de groupe

J'ai créé ma demande, mais à chaque fois je reviens "{\"details\":\"missing photo parameter\",\"problem\":\"The API request is malformed\"}\n

Mon paramètre photo ressemble à ceci :

"-------------------------------8cd9bfbafb3ca00 Content-Disposition :Données de formulaire;nom=\"nom de fichier\";filename=\"somefile.jpg\" Content-Type :image/jpg (quelques déchets binaires répertoriés ici) ---------------------------- -8cd9bfbafb3ca00--"

Je ne sais pas vraiment si c'est un problème avec la façon dont je présente les données binaires de l'image (actuellement dans mon événement PhotoTaskCompleted, je lis le contenu de e.ChosenPhoto dans un octet[] et le transmets à une méthode d'assistance pour créer les données du formulaire) ou si je ne crée tout simplement pas le formulaire correctement.

J'essaie juste de faire cela aussi simplement que possible, puis je pourrai refactoriser une fois que je saurai comment tout cela fonctionne.

 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;
    }
Était-ce utile?

La solution

Hammock pour Windows Phone rend cela très simple.Vous ajoutez simplement le fichier à la requête en utilisant le AddFile méthode et transmettez-lui le flux de photos.

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

Autres conseils

Hum, es-tu sûr que ton PostForm est correct ?Les paramètres content-* doivent être définis dans les en-têtes de votre POST et non dans le corps ?

var request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.Authorization,"blabla");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top