2016-03-07 9 views
5

Próbuję użyć facebook API do przesyłania obrazu z płótna zapisać na stronie:Przesyłanie obrazu canvas do facebook jak Blob typu multipart/form-data

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

FB.api('/me/photos', 'POST', { 
    source: file, 
    message: 'photo description' 
}, function (response) { 
    console.log(response) 
    } 
) 

To blob Przelicznik:

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' }); 
} 

i otrzymuję błąd: message: "(#324) Requires upload file" więc wydaje przesyłający nie rozpoznaje blob jako ważnego pliku.


Aktualizacja 1:

I Fount ten post: Convert Data URI to File then append to FormData o konwersji blob do formData, próbował go tak:

var dataURL = canvas.toDataURL('image/jpeg', 1.0) 
var blob = dataURItoBlob(dataURL) 
var fd = new FormData(document.forms[0]) 
fd.append("canvasImage", blob) 

FB.api('/me/photos', 'POST', { 
    source: fd ..... 

ale nadal ten sam błąd.


UPDATE 2:

nawet próbował to rozwiązanie XHR poczta, Using Facebooks javascript api to post multipart/form-data encoded image i wciąż otrzymuję pliku problem "Your photos couldn't be uploaded. Photos should be less than 4 MB and saved as JPG, PNG, GIF or TIFF files."

function postImageToFacebook(access_token) { 
    var filename = "samplepic.png", 
    mimeType = "image/png", 
    message = "test comment", 
    data = canvas.toDataURL("image/png"), 
    encodedPng = data.substring(data.indexOf(',') + 1, data.length), 
    imageData = atob(encodedPng); 

    // build the multipart/form-data 
    var boundary = '----ThisIsTheBoundary1234567890'; 
    var formData = '--' + boundary + '\r\n' 
    formData += 'Content-Disposition: form-data; name="source"; filename="' + filename + '"\r\n'; 
    formData += 'Content-Type: ' + mimeType + '\r\n\r\n'; 
    for (var i = 0; i < imageData.length; ++i) { 
    formData += String.fromCharCode(imageData[i] & 0xff); 
    } 
    formData += '\r\n'; 
    formData += '--' + boundary + '\r\n'; 
    formData += 'Content-Disposition: form-data; name="message"\r\n\r\n'; 
    formData += message + '\r\n' 
    formData += '--' + boundary + '--\r\n'; 

    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', 'https://graph.facebook.com/v2.5/me/photos?access_token=' + access_token, true); 
    xhr.onload = xhr.onerror = function() { 
    console.log(xhr.responseText); 
    }; 
    xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary); 
    xhr.send(formData); 
} 
+0

API robi nie składać samodzielnie wniosku w wymaganym formacie ("multipart/form-data"). Sprawdź, jak emulować prawidłowe przesyłanie plików w JavaScript. – CBroe

+0

Zaktualizowano. Nadal nie działa – ilyo

+0

Nie możesz użyć do tego 'FB.api' - nigdy nie sprawi, że żądanie będzie we właściwym formacie. Musisz utworzyć własne żądanie HTTP POST i samodzielnie dostarczyć wszystkie niezbędne parametry, takie jak token dostępu. – CBroe

Odpowiedz

7

zorientowali się, z jakiegoś powodu, kwestie były nagłówki że próbowałem zastosować jako rozwiązanie poprzedniego problemu ... Oto działające rozwiązanie: 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

Po trzech dniach próbowania i zawierania innych rozwiązań, twoje rozwiązanie za pomocą postu jsFiddler pozwoliło mi opublikować zdjęcia na płótnie bezpośrednio na Facebooku z mojej aplikacji localhost. To jest niesamowite! Jedna rzecz do zapamiętania, właściwość "token", której użyłem, pochodzi z https://developers.facebook.com/tools/explorer/ Wszystko działało! –

0

Aby przesłać bezpośrednio z płótna na Facebooku zdjęć, to działa na mnie:

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'}); 
} 

Aby go użyć

// *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 od: http://gorigins.com/posting-a-canvas-image-to-facebook-and-twitter/

Powiązane problemy