2

如何使用 FB api 将视频文件上传到 Facebook?我环顾了stackoverflow,但只有当视频/图片已经在线某处时才能找到答案,但我想让用户通过我的应用程序直接将文件上传到facebook。

可以上传到 facebook 的一种解决方案是https://stackoverflow.com/a/8195849/364938,但它假设我在某处有在线图片。

这甚至可能吗?如果是,那怎么办?

4

1 回答 1

0

这是我从客户端使用 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))
    })
}
于 2018-12-16T19:48:00.973 回答