Uploading a canvas image to facebook as Blob of multipart/form-data type

后端 未结 2 611
死守一世寂寞
死守一世寂寞 2021-01-05 14:31

I am trying to use the facebook api to upload an image from a canvas I save on the page:

var file = dataURItoBlob(canvas.toDataURL(\'image/jpeg\', 1.0))

FB.         


        
相关标签:
2条回答
  • 2021-01-05 15:00

    To upload directly from canvas to Facebook photos, this works for me:

    function postImageToFacebook(token, imageData, message, successCallback, errorCallback) {
      var fd = new FormData();
      fd.append("access_token", token);
      fd.append("source", imageData);
      fd.append("caption", message);
    
      $.ajax({
          url: "https://graph.facebook.com/me/photos?access_token=" + token,
          type: "POST",
          data: fd,
          processData: false,
          contentType: false,
          cache: false,
          success: function (data) {
            successCallback(data);
          },
          error: function (shr, status, data) {
            errorCallback(data);
          },
          complete: function (data) {
            console.log('Completed');
          }
      });
    }
    
    function dataURItoBlob(dataURI) {
      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'});
    }
    

    To use it

    // *IMPORTANT*
    var FBLoginScope = 'publish_actions'; // or sth like 'user_photos,publish_actions' if you also use other scopes.
    
    var caption = "Hello Facebook!";
    var successCallback = ...;
    var errorCallback = ...;
    
    var data = $('#your_canvas_id')[0].toDataURL("image/jpeg");
    try {
      imageData = dataURItoBlob(data);
    } catch (e) {
      console.log(e);
    }
    
    FB.getLoginStatus(function (response) {
      if (response.status === "connected") {
        postImageToFacebook(response.authResponse.accessToken, imageData, caption, successCallback, errorCallback);
      } else if (response.status === "not_authorized") {
        FB.login(function (response) {
            postImageToFacebook(response.authResponse.accessToken, imageData, caption, successCallback, errorCallback);
        }, {scope: FBLoginScope});
      } else {
        FB.login(function (response) {
            postImageToFacebook(response.authResponse.accessToken, imageData, caption, successCallback, errorCallback);
        }, {scope: FBLoginScope});
      }
    });
    

    Modified from: http://gorigins.com/posting-a-canvas-image-to-facebook-and-twitter/

    0 讨论(0)
  • 2021-01-05 15:03

    I figured out, for some reason, the issues was the headers that I tried to apply as a solution for a previous problem... Here is a working solution: https://jsfiddle.net/ilyador/vyne7oh2/8/

    function fbUpload(token){
      var dataURL = canvas.toDataURL('image/jpeg', 1.0)
      var blob = dataURItoBlob(dataURL)
      var formData = new FormData()
      formData.append('token', token)
      formData.append('source', blob)
    
      var xhr = new XMLHttpRequest();
      xhr.open( 'POST', 'https://graph.facebook.com/me/photos', true )
      xhr.onload = xhr.onerror = function() {
        console.log( xhr.responseText )
      };
      xhr.send( formData )
    }
    
    function dataURItoBlob(dataURI) {
      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' });
    }
    
    0 讨论(0)
提交回复
热议问题