【问题标题】:Error in newMediaItemResults in Google Photos APIGoogle Photos API 中的 newMediaItemResults 错误
【发布时间】:2026-01-18 04:50:01
【问题描述】:

我能够在batchCreate 上获得上传令牌和 200 状态代码。然而,详细的回应是这样的;

{
  "newMediaItemResults": [
    {
      "uploadToken": "CAISqQMAqD4uLZF/uW6bVfUSjQTCRLEgg9ngZv9lS/VqwBw3puvDr2+FGxes9bCQ6VRS8Wd3hdm1sqmZ07CAclBbqR2S+JqRJoOS820km7RHGlZvODMcg1e+U5aFx5I+w59lz0NoyfmaUq4FQ7TqaoTqkW7vgOd2+s5z9qZtAYbqovR7+Az6xfUoZ7wZGwVnDDC0Q9Naf/Qu9qOo3yemZ/jVyE5gMpTj4jtAd+cb4DBCtWLK5cZREJUq18wiB3MqojF5Kv7UOo15dxgRTMR3lib+3s6W+BlBTc1LjZ7WSAr6PX1kA/wgxz74Cpo4neM4WRwPp5E+mSSHCGHpFzPKE8t5xpN71aOrM1d8WoT0jZApnDCAv5ggMUteli9BNSTZSPcZb7AJNUAssUKsDfb0F9NoZedDfrQZUlGH0UqYjj7X74Uk7qMtDCp2XS65LuiUNS2VCkOZydPg2Vtapvpgo/n+h2ib00+e3ci+H1+Zlo7OMH+j99TZof7p7fOdnOcQ2vF+EATdG4p6DatxFvE1op/M8hfvgVAYqV9h6aWUzxIDNKRSy1JKFcM7LO5DIA",
      "status": {
        "code": 3,
        "message": "Failed: There was an error while trying to create this media item."
      }
    }
  ]
}

有人可以向我解释我做错了什么吗?

以下是上传功能的代码;

uploadImages(images, token) {
        const promises = Array.from(images).map(image => {
            const formData = new FormData();
            formData.append('media-binary-data', image);
            console.log(formData);
            return axios.post(`${UPLOAD_URL}`, formData, {
                headers: {
                    'Content-Type': "application/octet-stream",
                    'X-Goog-Upload-File-Name': '',
                    'X-Goog-Upload-Protocol': "raw",
                    'Authorization': `Bearer ${token}`,
                },

            }).then((response) => {
                return axios.post('https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate',
                    {
                        "newMediaItems": [
                            {
                                "description": "item-description",
                                "simpleMediaItem": {
                                    "uploadToken": response.data
                                }
                            }
                        ]
                    }
                    ,
                    {
                        headers: {
                            'Content-type': 'application/json',
                            'Authorization': `Bearer ${token}`,
                        },

                    })
            })
        });

        return Promise.all(promises);
    }

【问题讨论】:

    标签: javascript json vue.js google-photos-api


    【解决方案1】:

    我相信你的目标如下。

    • 您希望使用带有 Javascript 的 axios 使用 Google Photo API 将图像文件上传到 Google Photo。
    • imagesconst promises = Array.from(images).map(image => {document.getElementById("###").files 来自 <input type="file" id="files" name="file" multiple>

    修改点:

    • 根据您的错误消息,我认为文件可能无法正确上传。
      • 在这个修改后的脚本中,FormData() 没有被使用。
    • 在“mediaItems.batchCreate”方法中,多个文件上传后,它们的文件可以用于一个API调用。
    • https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate的请求体内容类型为application/json。所以在这种情况下,请在请求正文中使用JSON.stringify

    当以上几点反映到您的脚本中时,它变成如下。在此修改中,作为示例情况,添加了 HTML 的标签。

    修改后的脚本:

    HTML 端:

    <input type="file" id="files" name="file" multiple>
    <input type="button" onclick="run()" value="ok">
    

    Javascript 端:

    请将您的访问令牌设置为token

    function uploadImages(images, token) {
      const promises = Array.from(images).map(image => {
        return new Promise(r => {
          axios.post("https://photoslibrary.googleapis.com/v1/uploads", image, {
            headers: {
              'Content-Type': "application/octet-stream",
              'X-Goog-Upload-File-Name': image.name,
              'X-Goog-Upload-Protocol': "raw",
              'Authorization': `Bearer ${token}`,
            }
          }).then((response) => {
            r({description: "item-description", simpleMediaItem: {fileName: image.name, uploadToken: response.data}});
          });
        });
      });
      return Promise.all(promises).then(e => {
        return new Promise((resolve, reject) => {
          axios.post('https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate',
            JSON.stringify({newMediaItems: e}),
            {headers: {'Content-type': 'application/json', 'Authorization': `Bearer ${token}`},
          })
          .then(resolve)
          .catch(reject);
        });
      });
    }
    
    // This function is run.
    function run() {
    
      const token = "###";  // Please set your access token.
    
      const files = document.getElementById("files").files;
      uploadImages(files, token)
      .then(e => console.log(e))
      .catch(err => console.log(err));
    }
    

    注意:

    • 在这个修改后的脚本中,它假设您的访问令牌可用于使用 Google Photo API 将图像文件上传到 Google Photo。请注意这一点。

    • 在这个修改后的脚本中,作为示例情况,添加了 HTML 的标签。在我的环境中,我可以确认上述修改后的脚本有效。但我认为上面的 HTML 标签可能与您的实际情况有所不同。所以请根据您的实际情况修改上述脚本。

    参考资料:

    【讨论】: