首页 > 解决方案 > 尝试在 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。根据描述更改的文档的选项是:

  1. 使用 webContentLink -- 下载
  2. 使用 webViewLink——查看
  3. 使用 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 的最佳方法是什么?

标签: google-drive-apigoogle-slides-api

解决方案


从您的脚本中,我认为您的问题的原因是由于thisaccess_token这样,就不能使用查询参数了。这种情况下,当image_url = '%s&access_token=%s' % (drive_service.files().get_media(fileId=image_file_id).uri,creds.token)使用时,返回登录页面。这样,就会发生这样的错误。因此,作为一种解决方法,以下流程如何?

流动:

  1. 上传一个PNG文件。
  2. 通过创建权限公开共享 PNG 文件。
  3. 将 PNG 文件插入幻灯片。
  4. 通过删除权限来关闭共享的 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 脚本,您可以在此处查看示例脚本。

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。


推荐阅读