Google 照片 API 中的 newMediaItemResults 出错
Error in newMediaItemResults in Google Photos API
我能够在 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);
}
我相信你的目标如下。
- 您想将图像文件上传到 Google Photo using Google Photo API using axios with Javascript.
const promises = Array.from(images).map(image => {
的 images
是 <input type="file" id="files" name="file" multiple>
的 document.getElementById("###").files
。
修改点:
- 根据您的错误信息,我认为文件可能无法正确上传。
- 在此修改后的脚本中,未使用
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 照片 API 将图像文件上传到 Google 照片。请注意这一点。
在此修改后的脚本中,作为示例情况,添加了 HTML 标签。在我的环境中,我可以确认上述修改后的脚本有效。但我认为上面的 HTML 标签可能与您的实际情况不同。所以请根据实际情况修改以上脚本。
参考文献:
我能够在 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);
}
我相信你的目标如下。
- 您想将图像文件上传到 Google Photo using Google Photo API using axios with Javascript.
images
是<input type="file" id="files" name="file" multiple>
的document.getElementById("###").files
。
const promises = Array.from(images).map(image => {
的 修改点:
- 根据您的错误信息,我认为文件可能无法正确上传。
- 在此修改后的脚本中,未使用
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 照片 API 将图像文件上传到 Google 照片。请注意这一点。
在此修改后的脚本中,作为示例情况,添加了 HTML 标签。在我的环境中,我可以确认上述修改后的脚本有效。但我认为上面的 HTML 标签可能与您的实际情况不同。所以请根据实际情况修改以上脚本。