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

Javascript Facebook API发布多部分/表单数据

程举
2023-03-14

这几天我一直被这个问题难住了。如果有人能给我指出正确的方向,我将不胜感激!我一直在想如何通过facebooks graph api发布图像。

我从Facebook上下载了一张图片,它通过图形API显示在画布元素中。我正在修改这个元素,在上面画文本,然后想把它上传回facebook。我被上传卡住了。

以下是我看过的有帮助的链接,但我仍然卡住了:

Facebook Graph API——使用JavaScript上传照片讨论了使用多部分/表单数据通过post请求上传到Facebook。

https://gist.github.com/andyburke/1498758代码来创建多部分表单数据,并向facebook发送发布图像的请求。

这是我在Facebook上传图片时用的代码

if ( XMLHttpRequest.prototype.sendAsBinary === undefined ) {
    XMLHttpRequest.prototype.sendAsBinary = function(string) {
        var bytes = Array.prototype.map.call(string, function(c) {
            return c.charCodeAt(0) & 0xff;
        });
        //this.send(new Uint8Array(bytes).buffer); //depreciated warning
        this.send(new Uint8Array(bytes));
    };
}

// This function takes an array of bytes that are the actual contents of the image file.
// In other words, if you were to look at the contents of imageData as characters, they'd
// look like the contents of a PNG or GIF or what have you.  For instance, you might use
// pnglib.js to generate a PNG and then upload it to Facebook, all from the client.
//
// Arguments:
//   authToken - the user's auth token, usually from something like authResponse.accessToken
//   filename - the filename you'd like the uploaded file to have
//   mimeType - the mime type of the file, eg: image/png
//   imageData - an array of bytes containing the image file contents
//   message - an optional message you'd like associated with the image

function PostImageToFacebook( authToken, filename, mimeType, imageData, message )
{
    console.log("filename " +  filename);
    console.log("mimeType " + mimeType);
    console.log("imageData " + imageData);
    console.log("message " + message);

    // this is the multipart/form-data boundary we'll use
    var boundary = '----ThisIsTheBoundary1234567890';

    // let's encode our image file, which is contained in the var
    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/me/photos?access_token=' + authToken, true );
    xhr.onload = xhr.onerror = function() {
        console.log( xhr.responseText );
    };
    xhr.setRequestHeader( "Content-Type", "multipart/form-data; boundary=" + boundary );
    xhr.sendAsBinary( formData );
    console.log(formData);
}

调用PostImageToFacebook函数会导致以下错误:

{
   "error": {
      "type": "Exception",
      "message": "Your photos couldn't be uploaded. Photos should be less than 4 MB and saved as JPG, PNG, GIF or TIFF files.",
      "code": 1366046
}

我记录的格式数据的输出,我粘贴下面:

----ThisIsTheBoundary1234567890
内容处置:窗体数据;名称="源";文件名="MemeImage.png"
内容类型:图像/png

------ThisIsTheBoundary1234567890
内容处置:窗体数据;名称="消息"

发布模因图像
------ThisIsTheBoundary1234567890-

共有2个答案

罗晨
2023-03-14

这是可能的,在一个不太复杂的方式,只要把画布图像变成一个博客与以下代码:

const dataURItoBlob = (dataURI) => {
    let byteString = atob(dataURI.split(',')[1]);
    let ab = new ArrayBuffer(byteString.length);
    let ia = new Uint8Array(ab);
    for (let i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ia], {
        type: 'image/jpeg'
    });
}

无需自行设置所有这些标题,只需使用带有FormData的博客即可:

formData.append('source', blob);

资料来源:http://www.devils-heaven.com/facebook-javascript-sdk-photo-upload-from-canvas/

苍和裕
2023-03-14

尝试替换

for ( var i = 0; i < imageData.length; ++i )
{
    formData += String.fromCharCode( imageData[ i ] & 0xff );
}

具有

formData += imageData;
 类似资料:
  • 所以这个HTML代码以正确的格式提交数据给我。 谢了!

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

  • 谢谢你过来。 我想使用fetch api发送一个作为请求的 手术看起来像这样 这里的问题是边界,比如 永远不要将其放入标题中 应该是这样的 当您使用尝试“相同”操作时,如下所示 标题设置正确 所以我的问题是, > 在这种情况下,我如何使的行为完全像? 如果这不可能,为什么? 谢谢大家!这个社区或多或少是我职业成功的原因。

  • 我想从React获取文件上传并将其发送到SpringBoot。我试图从React FormData发布,它将包含文件名和XML文件的键值对。因此,当我尝试将FormData发布到后端(即Springboot)时,它返回: 这是我的Springboot控制器: 我已经尝试在Axios post请求的头中指定multipart/form-data,但似乎不起作用。问题出在我的请求里还是出在我的控制器上

  • 问题内容: 我正在使用请求库编写Web Service客户端。我正在包含文件和text-json的multipart / form- data中获取数据。我不知道如何解析它。是否有合适的库可以解析python中的multipart / form-data格式,还是我应该自己编写解析器? 我的代码: b’\ r \ n–c00750d1-8ce4-4d29-8390-b50bf02a92cc \ r

  • 我正试图将一个文件发送到box(云存储)。应该很容易,但事实并非如此。 我使用RequestBin进行调试。 在命令行上使用curl时,它工作得很好(文件被张贴到框中): 卷曲cli(正确): 生坯 -------------------------------------------------------------------------------------------------nam