【问题标题】:"Failed: There was an error while trying to create this media item."“失败:尝试创建此媒体项目时出错。”
【发布时间】:2020-06-01 12:52:27
【问题描述】:

我正在尝试使用 google api 在 Google 照片上上传照片,但我总是收到此错误:

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

我认为问题在于我获取照片二进制数据的方式。

在此代码中,我遵循 google photo api 开发人员文档,并在获得授权后说: 1-将原始字节上传到谷歌服务器:获取上传令牌 2- 使用上传令牌创建媒体项目。

这是我的节点 js 代码:

const photo = fs.readFileSync("fbimages/"+req.session.id_client+"/Prague/2020-05-30T17:29:14+0000_0.png", {
            'encoding': 'binary',
            'flag' : 'r'
        });


 var url= 'https://photoslibrary.googleapis.com/v1/uploads';
 var headers= {
     'Authorization': 'Bearer '+token,
     'Content-type': 'application/octet-stream',
     'X-Goog-Upload-Content-Type': 'image/png',
     'X-Goog-Upload-Protocol': 'raw',
     'X-Goog-Upload-File-Name': "2020-05-30T17:29:14+0000_0.png",
 };
 var body= photo

 request({
      url: url,
      method:'POST',
      headers: headers,
      rejectUnauthorized: false,
      body: JSON.stringify(body)
  }, function(error, response, body1){
      if(error)
      {
        console.log(error);
      }
      else
      {
         var upToken = body1.toString();

         console.log(upToken);

         var url= 'https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate';
         var headers= {
             'Authorization' : 'Bearer '+token,
             'Content-type': 'application/json',
         };
         var body= {
             'newMediaItems': [
                 {
                   'description': 'Prague',
                   'simpleMediaItem': {
                         'fileName': 'prova',
                         'uploadToken': upToken,
                    }
                 }
             ]
         };
         request({
             url: url,
             method: 'POST',
             headers: headers,
             rejectUnauthorized: false,
             body: JSON.stringify(body),

           }, function(error, response, body){
              if(error)
              {
                 console.log(error);
               }
               else
               {
                  res.send(JSON.parse(body));
                }
          });
   }});

如果有人有任何想法,请帮助我!!

【问题讨论】:

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


    【解决方案1】:

    这个修改怎么样?

    修改点:

    • 我认为encoding: "binary" 不是必需的。
      • 在这种情况下,``const photo = fs.readFileSync("fig1.png", { flag: "r" });andconst photo = fs.readFileSync("fig1.png");` 可以使用。
    • 请将body: JSON.stringify(body) 修改为photo of const photo = fs.readFileSync("fig1.png", { flag: "r" });

    当以上几点反映到你的脚本中时,它变成如下。

    修改脚本:

    从:
    const photo = fs.readFileSync("fbimages/"+req.session.id_client+"/Prague/2020-05-30T17:29:14+0000_0.png", {
                'encoding': 'binary',
                'flag' : 'r'
            });
    
    
     var url= 'https://photoslibrary.googleapis.com/v1/uploads';
     var headers= {
         'Authorization': 'Bearer '+token,
         'Content-type': 'application/octet-stream',
         'X-Goog-Upload-Content-Type': 'image/png',
         'X-Goog-Upload-Protocol': 'raw',
         'X-Goog-Upload-File-Name': "2020-05-30T17:29:14+0000_0.png",
     };
     var body= { 'media-binary-data': photo }
    
     request({
          url: url,
          method:'POST',
          headers: headers,
          rejectUnauthorized: false,
          body: JSON.stringify(body)
      }, function(error, response, body1){
    
    到:
    const photo = fs.readFileSync("fbimages/"+req.session.id_client+"/Prague/2020-05-30T17:29:14+0000_0.png", { flag: "r" });
    
    var url = "https://photoslibrary.googleapis.com/v1/uploads";
    var headers = {
      Authorization: "Bearer " + token,
      "Content-type": "application/octet-stream",
      "X-Goog-Upload-Content-Type": "image/png",
      "X-Goog-Upload-Protocol": "raw",
      "X-Goog-Upload-File-Name": "2020-05-30T17:29:14+0000_0.png",
    };
    
    request(
      {
        url: url,
        method: "POST",
        headers: headers,
        rejectUnauthorized: false,
        body: photo,
      },
      function (error, response, body1) {
    

    注意:

    • 在此修改中,假设您的token 可以用于此API。请注意这一点。
    • 当您想将上传的图片直接放到相册中时,请添加albumId 以请求https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate

    参考:

    【讨论】:

    • 非常感谢,我解决了:var file = fs.readFileSync("fbimages/"+req.session.id_client+"/"+titolo+"/"+foto, 'binary'); var photo = Buffer.from(file, 'binary');
    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多