Pregunta


Estoy tratando de cargar una foto a una API de descanso en una aplicación Windows Phone 7 usando RestSharp para mis publicaciones.
Los parámetros de post son los siguientes:

foto : La foto, codificada como Multipart / Forma-Data
photo_album_id : Identificador de un álbum de fotos existente, que puede ser un evento o grupo. álbum

He creado mi solicitud, pero cada vez que recibo "{\"details\":\"missing photo parameter\",\"problem\":\"The API request is malformed\"}\n

Mi parámetro de fotos se ve así:

"---------------------------- 8cd9bfbafb3ca00 \ r \ ncontent-disposición: Formulario-DATOS; NOMBRE= \" FILENAME \ " ; filename="somefile.jpg \" \ r \ ncontent-tipo: imagen / jpg \ r \n\ r \n(algunas basura binaria que figura aquí) \ r \n----------- ------------------ 8cd9bfbafb3ca00 - "

No estoy seguro de que es un problema con cómo presento los datos binarios de la imagen (actualmente en mi evento PhotoTaskCompleted, leí los contenidos de E.ChotoPhoto en un byte [] y pasan a un Método de ayuda para crear los datos del formulario) o si simplemente no creo el formulario correctamente.

Solo estoy tratando de hacer esto lo más simple posible, entonces puedo hacer un refactor una vez que sepa cómo funciona todo.

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

¿Fue útil?

Solución

Hammock for Windows Phone makes this real simple. You just add the file to the request using the AddFile method and pass it the photo stream.

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

Otros consejos

Hum are you sure that your PostForm is correct ? The content-* params should be set in the headers of your POST and not in the body ?

var request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.Authorization,"blabla");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top