Facebook новый javascript sdk - загрузка фотографий с ним!

Я пытаюсь загрузить фотографию в альбом facebook с помощью этого кода javaascript.

FB.api('/me/photos', 'post', {    access_token: GetToken(),
                            name: 'uploaded photo',
                            source: '@http://example.com/example.jpg' }, 
            function(response) {
                if (!response || response.error) {
                    alert('Error occured ' + response.error.message);
                } else {
                    alert('Post Id: ' + response.id);
                }
            });

Может кто-нибудь мне помочь с этим кодом. Этот код ничего не возвращает.

Ответ 1

Предполагая, что вы хотите сделать это в чистом JavaScript/JQuery - вам нужно использовать iframe в качестве цели формы, есть предостережение - вы не сможете использовать возвращаемые данные (идентификатор/успех вызова) из-за той же политики происхождения.

Сначала создайте форму, в которой будут храниться входные данные файла и любые другие переменные, которые вы хотите установить:

<form id="upload-photo-form">
    <input name="source" id="source" size="27" type="file" />
    <input name="message" id="message" type="text" value="message example please ignore" />
</form>

Вот основная используемая функция, которая создает iframe, указывает форму для ее использования, а затем извлекает последнюю фотографию из альбома с помощью FQL.

function fileUpload(form, action_url, div_id) {
    // Create an iframe 
    var iframe = document.createElement("iframe");
    iframe.setAttribute('id', "upload_iframe");
    iframe.setAttribute('name', "upload_iframe");
    iframe.setAttribute('width', "0px");
    iframe.setAttribute('height', "0px");
    iframe.setAttribute('border', "0");
    iframe.setAttribute('style', "width: 0; height: 0; border: none;");

    // Add to document.
    form.parentNode.appendChild(iframe);
    window.frames['upload_iframe'].name = "upload_iframe";

    iframeId = document.getElementById("upload_iframe");

    // Add event to detect when upload has finished
    var eventHandler = function () {

        if (iframeId.detachEvent)
        {
            iframeId.detachEvent("onload", eventHandler);
        }
        else
        {
            iframeId.removeEventListener("load", eventHandler, false);
        }

        setTimeout(function() {
            try
            {
                $('#upload_iframe').remove();
            } catch (e) {

            }
        }, 100);

        FB.api({
            method: 'fql.query',
            query: 'SELECT src_big,pid,caption,object_id FROM photo WHERE aid= "' + albumID + '" ORDER BY created DESC LIMIT 1'
            },
            function(response) {
                console.log(response);
            }
        );

    }

    if (iframeId.addEventListener)
        iframeId.addEventListener('load', eventHandler, true);
    if (iframeId.attachEvent)
        iframeId.attachEvent('onload', eventHandler);

    // Set properties of form...
    form.setAttribute('target', 'upload_iframe');
    form.setAttribute('action', action_url);
    form.setAttribute('method', 'post');
    form.setAttribute('enctype', 'multipart/form-data');
    form.setAttribute('encoding', 'multipart/form-data');

    // Submit the form...
    form.submit();

}   

Во время выполнения вы, вероятно, знаете albumObjectID из предыдущего вызова и имеете токен доступа из объекта сеанса, который возвращается логином или сеансом onauthchange.

var url = 'https://graph.facebook.com/' + albumObjectID + '/photos?access_token=' +  accessToken;
fileUpload($('#upload-photo-form')[0], url, $('#upload-photo-div')[0]);`

Очевидно, что это не производственный код, есть несколько вещей, которые вы можете сделать для повышения его надежности (например, проверка ширины, высоты, заголовка и тегов представленного изображения на последнее изображение). Проверка последнего изображения до и после попытки загрузки и т.д.

PS: Остерегайтесь albumObjectID vs albumID, они различны, однако оба могут быть получены с использованием некоторых простых запросов FQL. (например: SELECT aid, object_id, can_upload, name FROM album WHERE owner = me() AND name = "My Album Name")

Надеюсь, что это поможет.
CameraSchoolDropout

Ответ 2

Вы находитесь недалеко от правильного запроса.

сначала убедитесь, что вы инициируете js sdk и запрашиваете разрешения для публикации.

тогда ваши два поля - это сообщение и URL:

var data = array();
data['message'] = 'hello world';
data['url'] = 'http://google.com/moo.jpg';

FB.api('/me/photos', 'post', data, function(response){
    if (!response || response.error) {
        //alert('Error occurred');
    } else {
        //alert('Post ID: ' + response.id);
    }
}); 

Ответ 3

// UPLOAD A LOCAL IMAGE FILE, BUT THIS CAN NOT BE DONE WITHOUT USER MANUAL OPERATION BECAUSE OF SECURITY REASONS
function fileUpload() {
  FB.api('/me/albums', function(response) {
    var album = response.data[0]; // Now, upload the image to first found album for easiness.
    var action_url = 'https://graph.facebook.com/' + album.id + '/photos?access_token=' +  accessToken;
    var form = document.getElementById('upload-photo-form');
    form.setAttribute('action', action_url);

    // This does not work because of security reasons. Choose the local file manually.
    // var file = document.getElementById('upload-photo-form-file');
    // file.setAttribute('value', "/Users/nseo/Desktop/test_title_03.gif")

    form.submit();
  });
}
// POST A IMAGE WITH DIALOG using FB.api
function postImage1() {
  var wallPost = {
    message: "Test to post a photo",
    picture: "http://www.photographyblogger.net/wp-content/uploads/2010/05/flower29.jpg"
  };
  FB.api('/me/feed', 'post', wallPost , function(response) {
    if (!response || response.error) {
      alert('Failure! ' + response.status + ' You may logout once and try again');
    } else {
      alert('Success! Post ID: ' + response);
    }
  });
}