ОТДЫХ Windows Phone Загрузка фото - PullRequest
2 голосов
/ 17 февраля 2011


Я пытаюсь загрузить фотографию в API REST в приложении для Windows Phone 7, используя RestSharp для моих запросов / сообщений.
Параметры записи следующие:

фотография : фотография, закодированная как multipart / form-data
photo_album_id : идентификатор существующего фотоальбома, который может быть альбомом события или группы

Я создал свой запрос, но каждый раз, когда я возвращаюсь "{\"details\":\"missing photo parameter\",\"problem\":\"The API request is malformed\"}\n

Мой параметр фотографии выглядит так:

"--------------------------- 8cd9bfbafb3ca00 \ r \ nContent-Disposition: form-data; name = \ "filename \"; filename = \ "somefile.jpg \" \r \ nContent-Type: image / jpg \ r \ n \ r \ n (здесь указан некоторый двоичный мусор) \ r \ n ----------------------------- 8cd9bfbafb3ca00 - "

Я не совсем уверен, если это проблема с тем, как я представляю двоичные данные для изображения (в настоящее время в моем событии PhotoTaskCompleted япрочитайте содержимое e.ChosenPhoto в байт [] и передайте его вспомогательному методу для создания данных формы) или если я просто не создаю форму правильно.

Я просто пытаюсь сделать это как можно более простым, тогда я могу выполнить рефакторинг, как только узнаю, как все это работает.

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

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Гамак для Windows Phone делает это действительно простым. Вы просто добавляете файл к запросу, используя метод AddFile, и передаете его потоку фотографий.

        var request = new RestRequest("photo", WebMethod.Post);
        request.AddParameter("photo_album_id", _album.album_id);
        request.AddFile("photo", filename, e.ChosenPhoto);
0 голосов
/ 18 февраля 2011

Хум, вы уверены, что ваш PostForm правильный?Параметры content- * должны быть установлены в заголовках вашего POST, а не в теле?

var request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.Authorization,"blabla");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
...