1 回答
TA贡献1802条经验 获得超6个赞
我相信你的目标如下。
您想要使用 axios 和 Javascript 使用 Google Photo API 将图像文件上传到 Google Photo。
images
是来自.const 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 标签可能与您的实际情况有所不同。所以请根据您的实际情况修改上面的脚本。
添加回答
举报