Facebook Graph API - upload photo using JavaScript

前端 未结 13 1268
温柔的废话
温柔的废话 2020-11-27 11:03

Is it possible to upload a file using the Facebook Graph API using javascript, I feel like I\'m close. I\'m using the following JavaScript

var params = {};
         


        
相关标签:
13条回答
  • 2020-11-27 11:27

    Yes, you can do this posting data to an iframe like here, or you can use jQuery File Upload . The problem is you can't get response from iframe, using plugin you can use a page handle.

    Example: upload a video using jQuery File Upload

    <form id="fileupload" action="https://graph-video.facebook.com/me/photos" method="POST" enctype="multipart/form-data">
        <input type="hidden" name="acess_token" value="user_acess_token">
        <input type="text" name="title">
        <input type="text" name="description">
        <input type="file" name="file"> <!-- name must be file -->
    </form>
    
    
    <script type="text/javascript">
    
        $('#fileupload').fileupload({
            dataType: 'json',
            forceIframeTransport: true, //force use iframe or will no work
            autoUpload : true,
            //facebook book response will be send as param
            //you can use this page to save video (Graph Api) object on database
            redirect : 'http://pathToYourServer?%s' 
        });
    </script>
    
    0 讨论(0)
  • 2020-11-27 11:27

    This still works. I am using it as below:

    var formdata= new FormData();
    if (postAs === 'page'){
        postTo = pageId; //post to page using pageID
    }
    
    formdata.append("access_token", accessToken); //append page access token if to post as page, uAuth|paAuth
    formdata.append("message", photoDescription);
    formdata.append("url", 'http://images/image.png');
    
    try {
        $.ajax({
            url: 'https://graph.facebook.com/'+ postTo +'/photos',
            type: "POST",
            data: formdata,
            processData: false,
            contentType: false,
            cache: false,
            error: function (shr, status, data) {
                console.log("error " + data + " Status " + shr.status);
            },
            complete: function () {
                console.log("Successfully uploaded photo to Facebook");
            }
        });
    } catch (e) {
        console.log(e);
    }
    

    I have to ask though if you people have any idea if this is advisable or has a big security risk compared to using PHP api for Facebook.

    0 讨论(0)
  • 2020-11-27 11:33

    Yes, this is possible, i find 2 solutions how to do that and they are very similar to each other, u need just define url parameter to external image url

    FIRST one using Javascript SDk:

    var imgURL="http://farm4.staticflickr.com/3332/3451193407_b7f047f4b4_o.jpg";//change with your external photo url
    FB.api('/album_id/photos', 'post', {
        message:'photo description',
        url:imgURL        
    }, function(response){
    
        if (!response || response.error) {
            alert('Error occured');
        } else {
            alert('Post ID: ' + response.id);
        }
    
    });
    

    and SECOND one using jQuery Post request and FormData:

     var postMSG="Your message";
     var url='https://graph.facebook.com/albumID/photos?access_token='+accessToken+"&message="+postMSG;
     var imgURL="http://farm4.staticflickr.com/3332/3451193407_b7f047f4b4_o.jpg";//change with your external photo url
     var formData = new FormData();
     formData.append("url",imgURL);
    
      $.ajax({
                        url: url,
                        data: formData,
                        cache: false,
                        contentType: false,
                        processData: false,
                        type: 'POST',
    
                        success: function(data){
                            alert("POST SUCCESSFUL");
                        }
                    });
    
    0 讨论(0)
  • 2020-11-27 11:35

    https://stackoverflow.com/a/16439233/68210 contains a solution that works if you need to upload the photo data itself and don't have a url.

    0 讨论(0)
  • 2020-11-27 11:35

    I seem to have a similar problem, but solutions above didn't work.

    I was using the solution suggested by Arrabi (just use the url property only) to post images without any problem. My images are around 2-3 MB each.

    When I migrated my app to another server (changing the absolute url of my images in the post) the method kept giving me 324 errors for images above around 100k size.

    I thought it was due to some Apache setting on my end, but when I changed apache for lighttpd the problem was still there.

    The connections from Facebook actually show up in my (apache) log:

    69.171.234.7 - - [08/Jun/2012:11:35:54 +0200] "GET /images/cards/1337701633_518192458.png HTTP/1.1" 200 2676608 "-" "facebookplatform/1.0 (+http://developers.facebook.com)"

    69.171.228.246 - - [08/Jun/2012:11:42:59 +0200] "GET /images/test5.jpg HTTP/1.1" 200 457402 "-" "facebookplatform/1.0 (+http://developers.facebook.com)"

    69.171.228.246 - - [08/Jun/2012:11:43:17 +0200] "GET /images/test4.jpg HTTP/1.1" 200 312069 "-" "facebookplatform/1.0 (+http://developers.facebook.com)"

    69.171.228.249 - - [08/Jun/2012:11:43:49 +0200] "GET /images/test2.png HTTP/1.1" 200 99538 "-" "facebookplatform/1.0 (+http://developers.facebook.com)"

    69.171.228.244 - - [08/Jun/2012:11:42:31 +0200] "GET /images/test6.png HTTP/1.1" 200 727722 "-" "facebookplatform/1.0 (+http://developers.facebook.com)"

    Only test2.png succeeded.

    0 讨论(0)
  • 2020-11-27 11:35

    I use the following to share a photo (some BitmapData from the Phaser framework). It seems to work...

    // Turn data URI to a blob ready for upload.
    dataURItoBlob(dataURI:string): Blob {
        var byteString = atob(dataURI.split(',')[1]);
        var ab = new ArrayBuffer(byteString.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < byteString.length; i++) {
            ia[i] = byteString.charCodeAt(i);
        }
        return new Blob([ab], { type: 'image/jpeg' });
    }
    
    // Share the given bitmapData as a photo on Facebook
    sharePhoto(accessToken: string, photo: BitmapData, message: string): void {
        // Create form data, set up access_token, source and message
        var fd = new FormData();
        fd.append("access_token", accessToken);
        fd.append("source", this.dataURItoBlob(photo.canvas.toDataURL("image/jpeg")));
        fd.append("message", message);
    
        var request = new XMLHttpRequest();
        var thisPtr = this;
        request.onreadystatechange = function () {
            if (request.readyState == XMLHttpRequest.DONE) {
                var json = JSON.parse(request.responseText);
                if (json.hasOwnProperty("error")) {
                    var error = json["error"];
                    if (error.hasOwnProperty("type")) {
                        var errorType = error["type"];
                        if (errorType === "OAuthException") {
                            console.log("Need to request more permissions!");
                        }
                    }
                }
            } else if (request.readyState == XMLHttpRequest.HEADERS_RECEIVED) {
    
            } else if (request.readyState == XMLHttpRequest.LOADING) {
    
            } else if (request.readyState == XMLHttpRequest.OPENED) {
    
            } else if (request.readyState == XMLHttpRequest.UNSENT) {
    
            }
        }
        request.open("POST", "https://graph.facebook.com/me/photos", true);
        request.send(fd);
    }
    
    0 讨论(0)
提交回复
热议问题