Facebook Graph API 如何在 node.js 中上传图片?
Facebook Graph API how to upload image in node.js?
我正在尝试遵循此指南:
https://developers.facebook.com/docs/graph-api/resumable-upload-api
在研究了如何附加 multipart/form-data 之后,按照指南中的建议,我想出了这个代码:
const FB = require("fb")
const fs = Npm.require("fs")
FB.setAccessToken(accesstoken)
const post = async () => {
let res = await FB.api("app/uploads", "post", {
file_type: "image/jpeg",
file_length: file_length,
})
if (!res || res.error) {
console.log(!res ? "error occurred" : res.error)
return
}
const http = require("http")
const FormData = require("form-data")
const form = new FormData()
const readStream = fs.createReadStream(imagepath)
form.append("file", readStream)
const req = http.request({
host: "graph.facebook.com",
headers: {
Authorization:
"OAuth accesstoken",
file_offset: 0,
Connection: "close",
...form.getHeaders(),
},
method: "POST",
path: "/" + res.id,
})
form.pipe(req, { end: true })
req.on("response", function (res) {
console.log(res)
})
return res
}
我想获取上传的文件句柄,但我在响应中得到的只是一个巨大的对象,它是这样开始的(状态码为 200):
IncomingMessage {
_readableState: ReadableState {
objectMode: false,
highWaterMark: 16384,
buffer: BufferList { head: null, tail: null, length: 0 },
length: 0,
pipes: null,
pipesCount: 0,
flowing: null, ...
我做错了什么?可能是我附加文件的方式。该指南没有说明给它起什么名字,所以我只是将它命名为“文件”。
非常感谢任何帮助。
我想出来了,虽然它可能不是最优的:
const FB = require("fb")
const fs = Npm.require("fs")
FB.setAccessToken(accessToken)
let post = async () => {
let res = await FB.api("app/uploads", "post", {
file_type: "image/jpeg",
file_length: file_length,
})
if (!res || res.error) {
console.log(!res ? "error occurred" : res.error)
return
}
const request = require("request")
request.post({
url: "http://graph.facebook.com/" + res.id,
formData: {
source: {
value: fs.createReadStream(imagePath),
options: {
filename: filename,
contentType: "image/jpeg",
},
},
},
headers: {
Authorization:
"OAuth AccessToken",
file_offset: 0,
Connection: "close",
'content-type' : 'multipart/form-data'
}
},
function (err, resp, body) {
if (err) {
console.log("Error!")
} else {
console.log("URL: " + body)
}
})
return res
}
return post()
我正在尝试遵循此指南:
https://developers.facebook.com/docs/graph-api/resumable-upload-api
在研究了如何附加 multipart/form-data 之后,按照指南中的建议,我想出了这个代码:
const FB = require("fb")
const fs = Npm.require("fs")
FB.setAccessToken(accesstoken)
const post = async () => {
let res = await FB.api("app/uploads", "post", {
file_type: "image/jpeg",
file_length: file_length,
})
if (!res || res.error) {
console.log(!res ? "error occurred" : res.error)
return
}
const http = require("http")
const FormData = require("form-data")
const form = new FormData()
const readStream = fs.createReadStream(imagepath)
form.append("file", readStream)
const req = http.request({
host: "graph.facebook.com",
headers: {
Authorization:
"OAuth accesstoken",
file_offset: 0,
Connection: "close",
...form.getHeaders(),
},
method: "POST",
path: "/" + res.id,
})
form.pipe(req, { end: true })
req.on("response", function (res) {
console.log(res)
})
return res
}
我想获取上传的文件句柄,但我在响应中得到的只是一个巨大的对象,它是这样开始的(状态码为 200):
IncomingMessage {
_readableState: ReadableState {
objectMode: false,
highWaterMark: 16384,
buffer: BufferList { head: null, tail: null, length: 0 },
length: 0,
pipes: null,
pipesCount: 0,
flowing: null, ...
我做错了什么?可能是我附加文件的方式。该指南没有说明给它起什么名字,所以我只是将它命名为“文件”。
非常感谢任何帮助。
我想出来了,虽然它可能不是最优的:
const FB = require("fb")
const fs = Npm.require("fs")
FB.setAccessToken(accessToken)
let post = async () => {
let res = await FB.api("app/uploads", "post", {
file_type: "image/jpeg",
file_length: file_length,
})
if (!res || res.error) {
console.log(!res ? "error occurred" : res.error)
return
}
const request = require("request")
request.post({
url: "http://graph.facebook.com/" + res.id,
formData: {
source: {
value: fs.createReadStream(imagePath),
options: {
filename: filename,
contentType: "image/jpeg",
},
},
},
headers: {
Authorization:
"OAuth AccessToken",
file_offset: 0,
Connection: "close",
'content-type' : 'multipart/form-data'
}
},
function (err, resp, body) {
if (err) {
console.log("Error!")
} else {
console.log("URL: " + body)
}
})
return res
}
return post()