RESTO Windows Phone upload de Fotos
-
14-11-2019 - |
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;
}
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";