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-tar
。 Ref 但 'mimeType': 'application/vnd.google-apps.file'
设置为元数据 (file_metadata
)。而且,mimetype='application/vnd.google-apps.file'
用于 MediaFileUpload
。我认为这些可能是您出现问题的原因。
- 在我的环境中,当我测试你的脚本时,我可以确认
Bad Request
的相同错误。
- 这样的话,把
application/x-tar
的mimeType给file_metadata
and/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)
参考:
我试图根据 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-tar
。 Ref 但'mimeType': 'application/vnd.google-apps.file'
设置为元数据 (file_metadata
)。而且,mimetype='application/vnd.google-apps.file'
用于MediaFileUpload
。我认为这些可能是您出现问题的原因。- 在我的环境中,当我测试你的脚本时,我可以确认
Bad Request
的相同错误。 - 这样的话,把
application/x-tar
的mimeType给file_metadata
and/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)