Загрузка фотографий из Facebook в C #? - PullRequest
2 голосов
/ 28 февраля 2011

Я пытаюсь загрузить фотографию в Facebook из приложения Windows Phone Silverlight с помощью API Graph Facebook, но получаю сообщение об ошибке: (# 324) Требуется загрузить файл. Кто-нибудь может увидеть что-то не так в моем коде?

    internal void PublishPhoto(System.IO.MemoryStream stream, string message, string accessToken)
    {
        var requestUriString = string.Format(
            CultureInfo.InvariantCulture, 
            "https://graph.facebook.com/{0}/photos?access_token={1}&message={2}",
            "me",
            accessToken,
            message);

        var webRequest = WebRequest.CreateHttp(requestUriString);

        webRequest.Method = "POST";

        var boundary = "7db3d9202a1";
        webRequest.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);

        webRequest.BeginGetRequestStream(new AsyncCallback(delegate (IAsyncResult result)
            {
                GetRequestStream(stream, boundary, result);

                BeginGetResponse(webRequest);

            }), webRequest);
    }

    private static void GetRequestStream(System.IO.MemoryStream imageStream, string boundary, IAsyncResult result)
    {
        var webRequest2 = result.AsyncState as HttpWebRequest;

        using (var requestStream = webRequest2.EndGetRequestStream(result))
        {
            using (StreamWriter writer = new StreamWriter(requestStream))
            {
                writer.WriteLine("--{0}\r", boundary);
                writer.WriteLine("Content-Disposition: form-data; filename=\"sketch.jpg\"\r");
                writer.WriteLine("Content-Type: image/jpg\r");

                byte[] buffer = imageStream.GetBuffer();
                requestStream.Write(buffer, 0, buffer.Length);

                writer.WriteLine("\r");
                writer.WriteLine("--{0}--\r", boundary);
            }

            imageStream.Close();
        }
    }

    private static void BeginGetResponse(HttpWebRequest webRequest)
    {
        webRequest.BeginGetResponse(new AsyncCallback(delegate(IAsyncResult result2)
        {
            var webRequest2 = result2.AsyncState as HttpWebRequest;

            try
            {
                using (var response = webRequest2.EndGetResponse(result2))
                {
                    using (var responseStream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            System.Diagnostics.Debug.WriteLine(reader.ReadToEnd());
                        }
                    }
                }
            }
            catch (WebException we)
            {
                System.Diagnostics.Debug.WriteLine(we.Message);

                using (var responseStream = we.Response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(responseStream))
                    {
                        var errorJson = reader.ReadToEnd();

                        var response = Newtonsoft.Json.JsonConvert.DeserializeObject<FacebookErrorResponse>(errorJson);

                        System.Diagnostics.Debug.WriteLine("Could not upload image to Facebook: {0}", response.Error.Message);
                    }
                }
            }
        }), webRequest);
    }
}

Ответы [ 2 ]

0 голосов
/ 28 февраля 2011

Хорошо, я ошибался в первый раз, но теперь у меня это есть.

Первая проблема, о которой мы уже позаботились выше, заключалась в том, что вы пропускали "-" перед каждой границей.и "-" после последней границы в теле POST.

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

Третья проблема заключается в том, что вы не сбрасываете writer перед записью данных изображения в основной поток (если Silverlight на телефоне не отличается от обычного .NET при автоматической очистке StreamWriters).

Для суммированиявверх, это должно работать:

            writer.WriteLine("--{0}\r", boundary);
            writer.WriteLine("Content-Disposition: form-data; filename=\"sketch.jpg\"\r");
            writer.WriteLine("Content-Type: image/jpg\r");
            writer.WriteLine("\r");
            writer.Flush();

            byte[] buffer = imageStream.GetBuffer();
            requestStream.Write(buffer, 0, buffer.Length);

            writer.WriteLine("\r");
            writer.WriteLine("--{0}--\r", boundary);
0 голосов
/ 28 февраля 2011

Попробуйте указать имя «источника», а также имя файла в заголовке Content-Disposition, т.е.

writer.WriteLine("Content-Disposition: form-data; name=\"source\"; filename=\"sketch.jpg\"\r");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...