使用Google Cloud Storage上传文件至Facebook附件API遇错求助
你遇到的这两个错误其实都有明确的解决方向,咱们一步步来梳理:
一、解决「(#100) Incorrect number of files uploaded」错误
这个问题主要出在FormData的字段配置上,Facebook的Attachment Upload API有两个关键要求你没满足:
文件字段名必须是
file
你代码里用的是filedata,但Facebook官方要求上传文件的字段名必须是file,否则服务端识别不到你上传的文件,自然会提示“上传文件数量不对”。需要为流指定文件名和Content-Type
直接把GCS的读取流传给FormData,Facebook可能无法识别文件的类型和名称,导致解析失败。你需要在append方法里补充这两个参数。
修正后的代码示例:
const stream = gcs().bucket('my bucket').file('mms-tp1pESD7hgWWLiOUziHz.jpg').createReadStream(); const message = new FormData(); // 注意字段名是`file`,不是`filedata`,同时指定文件名和Content-Type message.append('message', JSON.stringify({ "attachment": { "type": "image", "payload": {"is_reusable": true} } })); message.append('file', stream, { filename: 'mms-tp1pESD7hgWWLiOUziHz.jpg', contentType: 'image/jpeg' }); fetch('https://graph.facebook.com/v2.6/me/message_attachments?access_token=<PAGE ACCESS TOKEN>', { method: 'POST', headers: message.getHeaders(), body: message }) .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error(err));
二、解决「(#546) The type of file you're trying to attach isn't allowed」错误
之前用URL上传时出现的这个错误,大概率是以下几个原因之一:
URL不可公开访问:Facebook的爬虫无法获取你的图片资源,比如你的存储桶设置了私有访问,或者URL需要登录验证、有防盗链限制。你可以用curl命令测试下:
curl -L https://memes-dev.mymemestore.com/mms-tp1pESD7hgWWLiOUziHz.jpg,看能不能直接拿到图片内容。Content-Type响应头不正确:服务器返回的Content-Type不是标准的图片类型(比如应该是
image/jpeg,但实际返回的是text/html或者application/octet-stream)。你可以用curl -I https://memes-dev.mymemestore.com/mms-tp1pESD7hgWWLiOUziHz.jpg查看响应头里的Content-Type字段。图片格式或大小不符合要求:Facebook要求图片必须是JPG、PNG格式,且大小不超过10MB。你可以检查下图片的实际格式和大小是否符合规范。
先试试修正流上传的代码,应该能解决第二个错误;如果还是想使用URL上传,再逐一排查上面的几个点。
内容的提问来源于stack exchange,提问作者Shadow1349

