Google Drive API v3 files.export 方法会引发 403 错误:“导出仅支持文档编辑器文件。”

dym*_*yma 1 python mime-types imagedownload google-drive-api

摘要
尝试使用 files.export 下载 JPEG 文件,但收到错误 403 消息:“导出仅支持文档编辑器文件。”

描述
我正在尝试将 Google Drive API 用于我的一个项目,这实际上就是收集一些图片,将它们存储在 Drive 上,然后将它们加载回来进行一些处理。很直接。
就此而言,我只是遵循API 文档和其中提供的示例代码片段。现在,我可以将图片上传到存储中。尝试下载它时,我遇到了以下错误消息:

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/1D1XpQwrCvOSEy_vlaRQMEGLQJK-AeeZ7/export?mimeType=image%2Fjpeg&alt=media returned "Export only supports Docs Editors files.". Details: "Export only supports Docs Editors files.">
Run Code Online (Sandbox Code Playgroud)

用于上传图片的代码如下所示:

 import io
 from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload

# GoogleDrive is a service created with googleapiclient.discovery.build

# upload a picture
file_metadata = {'name': 'example_on_drive.jpg'}
media = MediaFileUpload('example_upload.jpg', mimetype='image/jpeg')
file = GoogleDrive.files().create(
    body=file_metadata,
    media_body=media,
    fields='id').execute()
Run Code Online (Sandbox Code Playgroud)

上传成功,我取回文件ID:

print(file) 
{'id': '1aBoMvaHauCRyZOerNFfwM8yQ78RkJkDQ'}
Run Code Online (Sandbox Code Playgroud)

我可以在我的 Google Drive 上看到它。
然后我尝试访问相同的文件:

request = GoogleDrive.files().export_media(fileId=file.get('id'), mimeType="image/jpeg")
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print("Download %d%%" % int(status.progress() * 100))
Run Code Online (Sandbox Code Playgroud)

此时发生错误。我看到网站上的 API Explorer 返回相同的错误,这就是为什么我很想得出结论,我的代码不是罪魁祸首。这file.export只有两个输入,我看不出我究竟是如何未能正确使用它。我查看了类似的问题,但其中大多数涉及下载文本文档,我的错误消息告诉我这与文档类型有关。我用错了mimeType吗?

官方页面上的错误处理建议不包含此特定错误消息。

你有什么建议吗?

Tan*_*ike 6

从 的错误提示来看Export only supports Docs Editors files.,为了下载除Google Workspace 文档(Document、Spreadsheet、Slides 等)以外的文件,很遗憾,无法使用“文件:导出”的方法。在您的情况下,当您要下载图像文件时,请使用“文件:获取”的方法。当你的脚本被修改时,它变成如下。

从:

request = GoogleDrive.files().export_media(fileId=file.get('id'), mimeType="image/jpeg")
Run Code Online (Sandbox Code Playgroud)

到:

request = GoogleDrive.files().get_media(fileId=file.get('id'))
Run Code Online (Sandbox Code Playgroud)

参考:

  • 下载文件
    • 关于使用“export”和“get”下载文件,可以在上面的官方文档中看到。