如何使用 FB api 将视频文件上传到 Facebook?我环顾了stackoverflow,但只有当视频/图片已经在线某处时才能找到答案,但我想让用户通过我的应用程序直接将文件上传到facebook。
可以上传到 facebook 的一种解决方案是https://stackoverflow.com/a/8195849/364938,但它假设我在某处有在线图片。
这甚至可能吗?如果是,那怎么办?
如何使用 FB api 将视频文件上传到 Facebook?我环顾了stackoverflow,但只有当视频/图片已经在线某处时才能找到答案,但我想让用户通过我的应用程序直接将文件上传到facebook。
可以上传到 facebook 的一种解决方案是https://stackoverflow.com/a/8195849/364938,但它假设我在某处有在线图片。
这甚至可能吗?如果是,那怎么办?
这是我从客户端使用 javascript 上传视频的代码。我使用 axios 进行 http 请求,但您可以使用自己的。
function uploadVideo(adaccount, access_token, file) {
return axios({
method: 'POST',
url: `${adaccount}/advideos`,
params: {
access_token,
upload_phase: 'start',
file_size: file.size
}
})
.then(res => {
return new Promise(resolve => {
resolve(transferVideo(
adaccount,
access_token,
res.data.upload_session_id,
res.data.start_offset,
res.data.end_offset,
file,
1
))
})
})
.catch(err => {
// Note: you can handle your error here
console.log(err)
})
}
function transferVideo(adaccount, token, sessionId, start, end, file, number) {
if (start === end) {
return new Promise(resolve => {
resolve(postVideo(adaccount, token, sessionId, file.name))
})
}
const blob = new Blob([file], {
type: file.type
})
const chunk = blob.slice(start, end, file.type)
const formData = new FormData()
formData.append(
'video_file_chunk',
chunk,
`@chunk${number}.${file.type.split('/')[1]}`
)
return new Promise(resolve => {
resolve(uploadVideoChunk(
adaccount,
token,
start,
sessionId,
formData
))
})
.then(res => {
return new Promise(resolve => {
resolve(transferVideo(
adaccount,
token,
sessionId,
res.start_offset,
res.end_offset,
file,
number++
))
})
})
.catch(err => {
throw new Error(JSON.stringify(err))
})
}
function uploadVideoChunk(adaccount, access_token, start_offset, upload_session_id, formData) {
return axios.post(`${adaccount}/advideos`, formData, {
headers: {
'content-type': 'multipart/form-data'
},
params: {
access_token,
upload_phase: 'transfer',
start_offset,
upload_session_id
}
})
.then(res => res.data)
.catch(err => {
throw new Error(JSON.stringify(err))
})
}
function postVideo(adaccount, access_token, upload_session_id, title) {
return axios({
method: 'POST',
url: `${adaccount}/advideos`,
params: {
access_token,
upload_phase: 'finish',
upload_session_id,
title
}
})
.then(res => res.data)
.catch(err => {
throw new Error(JSON.stringify(err))
})
}