Загрузка фото в существующий альбом - PullRequest
0 голосов
/ 03 февраля 2012

Я делаю тест, чтобы попытаться загрузить фотографии в профиль пользователя.Я смог заставить его загрузить фотографию в альбом приложения по умолчанию, разместив ее в / me / photos;однако, когда я пытаюсь опубликовать другую фотографию в том же альбоме тем же методом, он возвращает OAuthException.То же самое происходит, когда я пытаюсь загрузить в отдельный существующий альбом.

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

Я пробовал как с .NET SDK, так и со стандартным PHP SDK.Оба дают одинаковый результат.

.NET SDK Code

Вот действие, которое я отправляю в мою форму:

public ActionResult UploadToDefaultAlbum(PhotoUploadModel model)
    {
        model = model ?? new PhotoUploadModel();

        if (model.IsPostback)
        {
            if (model.PhotoUpload != null)
            {
                var fb = new FacebookWebClient(model.AccessToken);
                dynamic parameters = new ExpandoObject();

                parameters.title = model.Title;
                parameters.description = model.Title + " description";
                parameters.source =
                    new FacebookMediaObject {ContentType = model.PhotoUpload.ContentType, FileName = model.PhotoUpload.FileName}.
                        SetValue(GetFileBytes(model.PhotoUpload.InputStream));

                var result = fb.Post("/me/photos", parameters);
                ViewBag.Message = result;
            }
            else
            {
                ViewBag.Message = "PhotoUpload is null";
            }
        }

        model.IsPostback = true;
        return View("Upload",model);
    }

Имоя HTML-форма:

@using (Html.BeginForm("UploadToDefaultAlbum", "Photos", FormMethod.Post, new { enctype = "multipart/form-data"})) { 
<fieldset>
    <legend>Upload to default App album</legend>

    <div class="editor-label">
        @Html.LabelFor(m => m.Title)
    </div>
    <div class="editor-field">
        @Html.InputFor(System.Web.Mvc.Html5.InputType.Text, x => x.Title)
    </div>

    <div class="editor-label">
        @Html.LabelFor(m => m.PhotoUpload)
    </div>
    <div class="editor-field">
        @Html.InputFor(System.Web.Mvc.Html5.InputType.File, x => x.PhotoUpload)
    </div>

    @Html.HiddenFor(x => x.IsPostback)
    @Html.HiddenFor(x => x.AccessToken)
    <button type="submit">Submit</button>
</fieldset>

}

Когда пользователь загружает страницу формы, я проверяю, что у него есть разрешения user_photos и publish_stream (с использованием атрибута CanvasAuthorize).

Есть ли что-то, чего мне не хватает, чтобы разрешить загружать в существующий альбом?

Код PHP SDK

Я скопировал этот код непосредственно из https://developers.facebook.com/blog/post/498/и просто установите переменные наверху для моего приложения.

<?php

   $app_id = "xxx";
   $app_secret = "xxx";
   $post_login_url = "https://localhost/facebookresearch/photoupload.php";
   $album_name = 'PHP Test Album';
   $album_description = 'YOUR_ALBUM_DESCRIPTION';

   $code = $_REQUEST["code"];

   //Obtain the access_token with publish_stream permission 
   if(empty($code))
     {
       $dialog_url= "http://www.facebook.com/dialog/oauth?"
       . "client_id=" . $app_id 
       . "&redirect_uri=" . urlencode($post_login_url)
       . "&scope=publish_stream";
       echo("<script>top.location.href='" . $dialog_url . 
       "'</script>");
   } 
   else {
     $token_url= "https://graph.facebook.com/oauth/"
     . "access_token?"
     . "client_id=" .  $app_id 
     . "&redirect_uri=" . urlencode( $post_login_url)
     . "&client_secret=" . $app_secret
     . "&code=" . $code;
     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);
     $access_token = $params['access_token'];

     // Create a new album
     $graph_url = "https://graph.facebook.com/me/albums?"
     . "access_token=". $access_token;

     $postdata = http_build_query(
     array(
      'name' => $album_name,
      'message' => $album_description
        )
      );
     $opts = array('http' =>
     array(
      'method'=> 'POST',
      'header'=>
        'Content-type: application/x-www-form-urlencoded',
      'content' => $postdata
      )
     );
     $context  = stream_context_create($opts);
     $result = json_decode(file_get_contents($graph_url, false, 
       $context));

     // Get the new album ID
     $album_id = $result->id;

     //Show photo upload form and post to the Graph URL
     $graph_url = "https://graph.facebook.com/". $album_id
       . "/photos?access_token=" . $access_token;
     echo '<html><body>';
     echo '<form enctype="multipart/form-data" action="'
     .$graph_url. ' "method="POST">';
     echo 'Adding photo to album: ' . $album_name .'<br/><br/>';
     echo 'Please choose a photo: ';
     echo '<input name="source" type="file"><br/><br/>';
     echo 'Say something about this photo: ';
     echo '<input name="message" type="text"
        value=""><br/><br/>';
     echo '<input type="submit" value="Upload" /><br/>';
     echo '</form>';
     echo '</body></html>';
  }

?>

Ответ:

{
   "error": {
      "message": "An unexpected error has occurred. Please retry your request later.",
      "type": "OAuthException"
   }
}

Он создает альбом, но может 'загрузить фото на него.Похоже, что в моем приложении есть неправильная настройка или ошибка в FB.Я бы предположил первое, но не могу понять, что это может быть.

Будет ли иметь значение, что приложение находится в режиме песочницы, и я использую тестового пользователя?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Похоже, это проблема только при использовании приложения в режиме песочницы. Я перевел свое приложение из режима песочницы, и все заработало как положено.

0 голосов
/ 03 февраля 2012

Это не ошибка в fb и не ошибка в php или csharp sdk. Это ожидаемое поведение.

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

...