【问题标题】:Can't Upload Image with Google Photos API using NodeJS无法使用 NodeJS 使用 Google Photos API 上传图像
【发布时间】:2020-02-14 16:14:52
【问题描述】:

我在 NodeJS 中构建了应用程序,假设使用谷歌照片 API 将图片上传到谷歌照片 对于我成功完成的身份验证部分,当我尝试上传图片时遇到问题我收到上传令牌没有问题但是当我尝试使用 mediaItems:batchCreate 它返回:

"status": {
    "code": 3,
    "message": "Failed: There was an error while trying to create this media item."
  }

这是我将图像转换为 base64 的代码:

var base64str = fs.readFileSync('1.jpg', 'base64');

这是我得到响应上传令牌的请求:

request({
method: 'post',
headers: {
'content-type' : 'application/octet-stream',
'Authorization': `Bearer ${userToken}`,
'X-Goog-Upload-File-Name' :  '1.jpg',
'X-Goog-Upload-Protocol' : 'raw'
},
url: `https://photoslibrary.googleapis.com/v1/uploads`,
rejectUnauthorized: false,
body: base64str
}, function(err,response,body) {
      console.log(body);
      });

到目前为止,我没有问题,因为(正文)响应是上传令牌并且我收到了它。 现在,当我想去第 2 步请求 mediaItems:batchCreate 时,这里是代码:

let reqObject = {
    newMediaItems: [
      {
        description: "Test Image Uploading",
        simpleMediaItem: {
        uploadToken: body //Body is the upload token received from prev request
        }
      }
    ]
  };
let reqObjectString = JSON.stringify(reqObject);

  request({
    method: 'post',
    headers: {
    'content-type' : 'application/json',
    'Authorization': `Bearer ${userToken}`,
    },
    url: `https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate`,
    rejectUnauthorized: false,
    body: reqObjectString
  }, function(err,response,result) {
      console.log(result);
});

这里的预期结果应该是成功上传媒体,但我总是得到这个响应:

{
  "newMediaItemResults": [
    {
      "uploadToken": "CAISmQMASsyg4MwSgB2y46/QI2yAAfw/uSeHZaiwGaskaT9J3SEvOtBg4bkOb9Fd0WMhE5OML8aMJMGZWNyC3Di/woTjLGD/VJMtKBk7bg1ZyK5CA+92vk0mjUWVR2LQhhTkEs02aHRr6EkCER3rxk3AqkhC+bxTIViLerUeoKigdlqozrEJXyCLM5U+Eqjdidi0e0hEFeLqs8Yz0V8YpyWQnN+zZUp/+R4pVT9fPXUOyNlsTj5OcMLrtC3Z/W9YnKhQA0O8io8LtmMBJTf04v3YPEtoNvJTd+k5Ux7qWQYJCS60V1R+hPl76jlryos3gnVaaCxHGH/TIMmtwo2zDH+vXTyktMhr82hdMON3Mm2PCfSbJawCLuHSNND9vojO11FEs7LVXAfY1UDDzVXwv4VV8tG9F3tQVI8/4YlkR+KJUjaX6/E4ZFWx67E+swqh16HN1RXXU211eCl36mPxsX35IGPEwvhpZ89LKfk+NU1fVuHB+pNLMNQ+mZOkKs0v6VLcN+nyMpOwjAstg4QUSJdCP+virY1a2uGKwYJh",      
        "status": {
        "code": 3,
        "message": "Failed: There was an error while trying to create this media item."
      }

谁能帮忙,先谢谢了

【问题讨论】:

  • 这里有同样的问题。我期待 Google 工程师的支持。 issuetracker.google.com/u/1/issues/117437699
  • @FrancisRodrigues 感谢分享,我通过将此代码 fs.readFileSync('1.jpg', 'base64') 更改为 'binary' 而不是 base64 作为 google 解决了我上面提到的问题这个api方法只接受二进制,试试吧
  • 您能分享一下您是如何让初始上传工作的吗?我正在使用 googlephotos 模块并遇到“未定义身份验证会话”错误。
  • @Michael 嗨,我使用 fs.readFileSync('1.jpg', 'binary') 解决了上述代码错误,以便符合 google api 请求,我希望这是答案您的问题,否则您能否详细分享您的问题,如果我知道,我可以支持

标签: javascript node.js google-photos-api


【解决方案1】:

您的评论完全正确。 google photos API 需要二进制格式的媒体,而不是 base64 格式。

我使用 React.js 和 FileReader 来读取媒体。我不得不使用:

const reader = new FileReader()
reader.readAsArrayBuffer()

获取数组缓冲区,然后图片上传成功。

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2013-01-08
    • 2016-09-30
    • 2019-01-30
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多