google-drive-api - 尝试在 Google 幻灯片演示文稿中插入图像时出现“提供的图像格式不受支持”错误
问题描述
我正在尝试使用 Slides API 在 Google 幻灯片演示文稿中插入图像 (PNG)。为此,我首先将图像上传到用户的驱动器,获取 url,通过正确的请求将其传递给 Slide API,然后删除图像文件。
几周前的工作方式:
image_url = '%s&access_token=%s' % (
drive_service.files().get_media(fileId=image_file_id).uri,
creds.token)
但是,Drive API 发生了变化,因此以这种方式构建的 URLS 不再起作用。
我很难找出要在此处使用的新的正确 URL。根据描述更改的文档的选项是:
- 使用 webContentLink -- 下载
- 使用 webViewLink——查看
- 使用 exportLinks -- 导出
我使用看起来像这样的代码来获取这些链接:
upload = drive_service.files().create(
body={'name': 'My Image File'},
media_body=media_body,
fields='webContentLink, id, webViewLink').execute()
image_url = upload.get('webContentLink')
我已经尝试了 #1 和 #2 并得到以下错误:
"Invalid requests[0].createImage: The provided image is in an unsupported format."
我也间歇性地收到以下错误:
"Invalid requests[0].createImage: Access to the provided image was forbidden."
我确认我能够从 #1 和 #2 中生成的 URL 下载/查看图像。我没有尝试#3,因为我没有尝试导出为不同的格式。
找出要使用的正确 URL 的最佳方法是什么?
解决方案
从您的脚本中,我认为您的问题的原因是由于this。access_token
这样,就不能使用查询参数了。这种情况下,当image_url = '%s&access_token=%s' % (drive_service.files().get_media(fileId=image_file_id).uri,creds.token)
使用时,返回登录页面。这样,就会发生这样的错误。因此,作为一种解决方法,以下流程如何?
流动:
- 上传一个PNG文件。
- 通过创建权限公开共享 PNG 文件。
- 将 PNG 文件插入幻灯片。
- 通过删除权限来关闭共享的 PNG 文件。
将图片文件放入Slides时,即使文件权限被删除,图片也不会从Slides中删除。此解决方法使用此方法。
示例脚本:
对于上述流程,python的示例脚本如下。uploadFilename
请设置presentation_id
和的变量pageObjectId
uploadFilename = './sample.png' # Please set the filename with the path.
presentation_id = '###' # Please set the Google Slides ID.
pageObjectId = '###' # Please set the page ID of the Slides.
drive = build('drive', 'v3', credentials=creds)
slides = build('slides', 'v1', credentials=creds)
# 1. Upload a PNG file from local PC
file_metadata = {'name': uploadFilename}
media = MediaFileUpload(uploadFilename, mimetype='image/png')
upload = drive.files().create(body=file_metadata, media_body=media, fields='webContentLink, id, webViewLink').execute()
fileId = upload.get('id')
url = upload.get('webContentLink')
# 2. Share publicly the uploaded PNG file by creating permissions.
drive.permissions().create(fileId=fileId, body={'type': 'anyone', 'role': 'reader'}).execute()
# 3. Insert the PNG file to the Slides.
body = {
"requests": [
{
"createImage": {
"url": url,
"elementProperties": {
"pageObjectId": pageObjectId
}
}
}
]
}
slides.presentations().batchUpdate(presentationId=presentation_id, body=body).execute()
# 4. Delete the permissions. By this, the shared PNG file is closed.
drive.permissions().delete(fileId=fileId, permissionId='anyoneWithLink').execute()
笔记:
- 我认为从您的脚本中,您可能正在将google-api-python-client与 python 一起使用。所以我提出了python的示例脚本。
- 在这种情况下,需要使用 Slides API 和 Drive API 的范围。请注意这一点。
- 对于 Google Apps 脚本,您可以在此处查看示例脚本。
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
推荐阅读
- c# - 使用键入用户自动完成组合框并从数据库中获取相关数据
- reactjs - 尝试将 AWS Lex 聊天机器人嵌入 React 站点,失败并出现错误:配置中缺少凭证(有关详细信息,请参阅控制台)
- facebook - Django-allauth:显示进度条的 Facebook 弹出窗口
- c++ - period 必须是 C++17 chrono 库中比率的专门化吗?
- c# - C# 中的 XmlWriter 编码
- regex - 使用 xdigit 在 Perl 中验证十六进制值
- javascript - 如何将值从引导弹出文本框传输到 asp.net 中的父页面文本框?
- git - 如何解决 tfs 中的这些错误“[error]Git checkout failed with exit code: 1”
- python - 当函数不返回某些东西时,我如何打印东西
- android - 如何使用firebase auth android无法返回android