当前位置: 首页 > 知识库问答 >
问题:

使用Facebook javascript api发布多部分/表单数据编码图像

樊腾
2023-03-14

根据Facebook在用户照片边缘上的图形文档,可以使用多部分/表单数据编码的二进制图像从javascript发布照片。https://developers.facebook.com/docs/graph-api/reference/v2.2/user/photos

/* make the API call */
FB.api(
    "/me/photos",
    "POST",
    {
        "source": "{image-data}"
    },
    function (response) {
      if (response && !response.error) {
        /* handle the result */
      }
    }
);

问题是网络上似乎没有任何关于这项工作的示例文档。有一种方法可以绕过FB。api并通过xhr请求直接发布到边缘。我已经做到了,但我真的很想知道如何使用FB做到这一点。api命令。以下是我的代码(FB应用程序已正确注册,文件中其他地方包含所有javascript sdk):

function postImageToFacebook(authToken) {
    //Capture the image from a canvas
    var filename = "samplepic.png",
    mimeType = "image/png",
    message = "test comment",
    data = canvas.toDataURL("image/png"),
    encodedPng = data.substring(data.indexOf(',') + 1, data.length),
    imageData = Base64Binary.decode(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';



    //METHOD #1: send the data using xhr request
    var xhr = new XMLHttpRequest();
    xhr.open( 'POST', 'https://graph.facebook.com/me/photos?access_token=' + authToken, true );
    xhr.onload = xhr.onerror = function() {
        console.log( xhr.responseText );
    };
    //vvv This right here seems to be key, being able to add a header vvv
    xhr.setRequestHeader( "Content-Type", "multipart/form-data; boundary=" + boundary );
    xhr.sendAsBinary( formData );


    //METHOD #2: send the data using FB.api
    FB.api("/me/photos", "POST", {
        "source": formData
    }, function(response) {
        console.log(response)
    });

};

方法#1:有效。我已经多次使用它来成功共享图像。当在Chrome中查看网络控制台时,您可以看到内容类型:多部分/form-data标头被设置,然后它将所有数据放入“请求有效载荷”中,返回响应是一个成功的后ID。

方法2:不起作用。Facebook返回的错误是(#324)需要上传文件。查看网络控制台,您可以看到设置了内容类型:application/x-www-form-urlencoded头(这是我们不想要的)。表单被放在表单数据下的“source”post参数下,这就是为什么我假设它会被Facebook拒绝。

制造FB需要什么魔法。api在这里工作正常吗?他们在文档中给出的唯一线索是W3关于多部分/表单数据规范的链接,我知道我的表单数据符合该规范,因为它在方法#1中与xhr一起工作。除了facebook文档中提到的以外,我找不到任何javascript方法实际有效的例子。帮助


共有1个答案

应和光
2023-03-14

我并没有在官方JS SDK(带有FB.api)中使用它,但这就是它在文件输入中的工作方式:

const fileReader = new FileReader();
const file = document.getElementById('imageInput').files[0];

fileReader.onloadend = async () => {
    const photoData = new Blob([fileReader.result], {type: 'image/jpg'});
    const formData = new FormData();

    formData.append('access_token', pageAccessToken);
    formData.append('source', photoData);
    formData.append('message', 'some status message');

    let response = await fetch(`https://graph.facebook.com/${pageId}/photos`, {
        body: formData,
        method: 'post'
    });
    response = await response.json();
    console.log(response);
};
fileReader.readAsArrayBuffer(file);

不需要额外的插件,FileReader和fetch API是本机Javascript功能。

如果输入是画布对象的Base64字符串,则可以使用以下方法:在JavaScript中从Base64字符串创建Blob

更多信息:http://www.devils-heaven.com/facebook-javascript-sdk-photo-upload-with-formdata/

 类似资料:
  • 问题内容: 我想发布多部分/表单数据编码的数据。我已经找到了执行此操作的外部模块:http : //atlee.ca/software/poster/index.html 但是我宁愿避免这种依赖性。有没有办法使用标准库来做到这一点? 谢谢 问题答案: 标准库当前不支持该功能。有一些食谱,其中包括您可能只想复制的一小段代码,以及对替代方法的长时间讨论。

  • 所以这个HTML代码以正确的格式提交数据给我。 谢了!

  • 这几天我一直被这个问题难住了。如果有人能给我指出正确的方向,我将不胜感激!我一直在想如何通过facebooks graph api发布图像。 我从Facebook上下载了一张图片,它通过图形API显示在画布元素中。我正在修改这个元素,在上面画文本,然后想把它上传回facebook。我被上传卡住了。 以下是我看过的有帮助的链接,但我仍然卡住了: Facebook Graph API——使用JavaS

  • 我正在尝试使用改版2.0向服务器发送HTTP POST 服务器返回一个错误,说明文件无效。 上传之前我应该先保存到磁盘吗? 附注:我已经为其他多部分请求使用了改型,但不包括图像,他们成功完成了。问题是当我试图在正文中包含一个字节时。

  • 问题内容: 我正在尝试使用multipart / form-data标头在PHP中使用cURL发布图像,因为我发送给的API期望图像以多部分形式发送。 使用其他请求与API通讯时,我没有任何问题;仅发布图像是一个问题。 我在客户端使用此表单: 这是我要发布到的服务器(在这里我试图将此数据转发到API): 使用下面的代码,我可以看到我的请求标头: 现在可以正确显示请求标题中的内容类型。但是似乎图像未

  • 我已经创建了一个使用“多部分/表单数据”的控制器 采样器请求对象 现在,我将尝试使用模拟MVC测试它,但我不知道如何将“多部分/表单数据”作为内容传递。我看到很多使用JSON的示例,但没有使用多部分/表单数据 有没有一种方法可以完成我的请求与多部分/form_data?理想情况下,它需要在MockHttpServletRequest的主体中