Pergunta


Eu estou tentando fazer upload de uma foto para uma api de REST em aplicativos do Windows Phone 7 usando RestSharp para o meu Fica/Posts.
Os parâmetros post são da seguinte maneira:

foto:A foto, codificados como multipart/form-data
photo_album_id:Identificador de um álbum de fotografias existente, o que pode ser um evento ou grupo de álbum

Eu criei o meu pedido, mas toda vez que eu recebo de volta "{\"details\":\"missing photo parameter\",\"problem\":\"The API request is malformed\"}\n

Minha foto parâmetro parecido com este:

"---------------------------8cd9bfbafb3ca00 Content-Disposition:formulário de dados;nome=\"nome do arquivo\";filename=\"somefile.jpg\" Content-Type:image/jpg (binário de lixo listados aqui) -----------------------------8cd9bfbafb3ca00--"

Eu não tenho muita certeza se é um problema com a forma como eu estou apresentando os dados binários para a imagem (atualmente em minha PhotoTaskCompleted evento, eu li o conteúdo do email.ChosenPhoto em um byte[] e passar para um método auxiliar para criar o formulário de dados) ou se eu apenas não criar o formulário corretamente.

Eu só estou tentando fazer uma simples possível, então eu posso refatorar uma vez eu sei como tudo funciona.

 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;
    }
Foi útil?

Solução

Rede para o Windows Phone torna isso real simples.Basta adicionar o arquivo para a solicitação usando o AddFile método e passar o photo stream.

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

Outras dicas

Hum tem a certeza de que o seu PostForm é correto ?O conteúdo* params deve ser definido nos cabeçalhos do seu POST e não no corpo ?

var request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.Authorization,"blabla");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top