googleapiclient.errors.HttpError 带有 google 驱动器 v3 api 上传错误

googleapiclient.errors.HttpError with google drive v3 api upload error

我试图根据 https://developers.google.com/drive/api/v3/manage-uploads#python_1 的文档在 google api 驱动器上上传可恢复的文件上传。下面给出了一个示例代码,我坚持目前的情况。

SCOPES = ['https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/drive.file','https://www.googleapis.com/auth/drive.appdata']
credentials = ServiceAccountCredentials.from_json_keyfile_name('json-file', SCOPES)
http=Http()
http.redirect_codes = http.redirect_codes - {308}
http_auth = credentials.authorize(http)
drive_service = build('drive', 'v3', http=http_auth,cache_discovery=False)

parent_id="folder-id"
source='/root/test.tar'
target='test.tar'
file_metadata = {'name': target, 'parents': [parent_id], 'mimeType': 'application/vnd.google-apps.file'}
media = MediaFileUpload(source,mimetype='application/vnd.google-apps.file',chunksize=1024*1024,resumable=True)
putfile=drive_service.files().create(body=file_metadata,media_body=media,fields='id').execute()
dest_id=putfile.get('id')

这些行存在以下错误。我不知道。

raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/upload/drive/v3/files?fields=id&alt=json&uploadType=resumable returned "Bad Request">

我想知道是什么导致了这个问题?

我相信你的目标如下。

  • 您想将 /root/test.tar 的 TAR 文件上传到云端硬盘 API,使用云端硬盘 API 和用于 python 的 googleapis。
  • drive_service 在您的脚本中可用于上传文件。
  • 您已经可以使用云端硬盘 API。

修改点:

  • 在您的脚本中,您正在尝试上传 TAR 文件。在这种情况下,上传文件的 mimeType 似乎是 application/x-tarRef'mimeType': 'application/vnd.google-apps.file' 设置为元数据 (file_metadata)。而且,mimetype='application/vnd.google-apps.file' 用于 MediaFileUpload。我认为这些可能是您出现问题的原因。
    • 在我的环境中,当我测试你的脚本时,我可以确认 Bad Request 的相同错误。
    • 这样的话,把application/x-tar的mimeType给file_metadataand/orMediaFileUpload怎么样?

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

file_metadata = {'name': target, 'parents': [parent_id], 'mimeType': 'application/vnd.google-apps.file'}
media = MediaFileUpload(source,mimetype='application/vnd.google-apps.file',chunksize=1024*1024,resumable=True)
到:
file_metadata = {'name': target, 'parents': [parent_id]}
media = MediaFileUpload(source, mimetype='application/x-tar', chunksize=1024*1024, resumable=True)

file_metadata = {'name': target, 'parents': [parent_id], 'mimeType': 'application/x-tar'}
media = MediaFileUpload(source, chunksize=1024*1024, resumable=True)
  • 或者,两者如下

      file_metadata = {'name': target, 'parents': [parent_id], 'mimeType': 'application/x-tar'}
      media = MediaFileUpload(source, mimetype='application/x-tar', chunksize=1024*1024, resumable=True)
    

注:

  • 在我的环境中,我确认上述模式有效。但我不确定你的实际环境。所以请测试以上。

  • 在Drive API,好像可以从上传文件的文件扩展名中添加mimeType。因此,在这种情况下,即使不使用 mimeType,脚本也可以运行并且可以上传文件。但是当我测试 TAR 文件时,mimeType 设置为 application/x-tar-compressed。这样,虽然文件已完全上传,但无法打开文件。所以我提议加入application/x-tar的mimeType。比如上传zip文件时,也可以使用下面的脚本。本例中上传文件的mimeType为application/x-zip-compressed,可以打开

      file_metadata = {'name': target, 'parents': [parent_id]}
      media = MediaFileUpload(source, chunksize=1024*1024, resumable=True)
    

参考: