使用google drive python API分块部分下载
使用使用google drive python API分块部分下载,python,google-drive-api,Python,Google Drive Api,使用google driveAPI(v3)分块下载文件,可以将该方法与request=service.files().get_media(fileId=)创建的请求对象结合使用 部分下载可以通过修改HTTP头的参数来完成,如中所述: 但是,这两者不能结合使用,因为头中的字节范围信息被mediaobasedownload忽略 如何以分块的方式完成部分下载?这是一个部分答案,它涉及范围的起始字节,而不是结束字节 正如评论中所指出的,mediaobasedownload忽略用户提供的HTTPRange
google drive
API(v3)分块下载文件,可以将该方法与request=service.files().get_media(fileId=)
创建的请求对象结合使用
部分下载可以通过修改HTTP头的参数来完成,如中所述:
但是,这两者不能结合使用,因为头中的字节范围信息被mediaobasedownload
忽略
如何以分块的方式完成部分下载?这是一个部分答案,它涉及范围的起始字节,而不是结束字节 正如评论中所指出的,
mediaobasedownload
忽略用户提供的HTTPRange
。一个范围,指定如下:
request.headers["Range"] = "bytes={}-{}".format(start, start+length)
实际上被添加到MediaIoBaseDownload
构造函数中的self.\u头文件
,但在第一次调用下一个块文件
方法时,会立即被覆盖,其中headers['range']
被设置为'bytes=%d-%d'(self.\u progress,self.\u progress+self.\u chunksize)
。在第一次调用时,self.\u progress=0
(由构造函数设置),因此该方法将始终从文件的第一个(第零个)字节开始下载
有几种简单的方法可以改变这一点。我们可以检查request.headers['Range']
是否存在,并解析指定的字节位置。或者,我们可以通过向构造函数添加额外的关键字参数来传递起始和结束字节位置,从而直接向调用方公开该行为
以下修补程序(针对GoogleAppClient
的1.7.11版)采用了将start
关键字参数添加到MediaIoBaseDownload
构造函数的方法,以便下载可以从n
字节开始。如果未指定起始字节,则默认为从文件开头下载。由于尚未实现对结束字节位置的支持,下载将持续到EOF
--- googleapiclient/http.py.orig 2019-08-05 12:24:31.000000000 -0700
+++ googleapiclient/http.py 2020-01-19 18:31:56.785404831 -0800
@@ -632,7 +632,7 @@
"""
@util.positional(3)
- def __init__(self, fd, request, chunksize=DEFAULT_CHUNK_SIZE):
+ def __init__(self, fd, request, chunksize=DEFAULT_CHUNK_SIZE, start=0):
"""Constructor.
Args:
@@ -646,7 +646,7 @@
self._request = request
self._uri = request.uri
self._chunksize = chunksize
- self._progress = 0
+ self._progress = start
self._total_size = None
self._done = False
我想这条线索也许能回答你的问题。这个怎么样?@Tanaike:是的,谢谢你,这很有帮助。然而,我想将其与
mediaobasedownload
结合起来,因为我需要分块下载,我从链接的帖子中注意到,这种方法与该方法不兼容。你知道如何分块进行部分下载吗?@Tanaike:也要感谢你。我非常感谢您的关注和帮助。顺便说一句,我认为当您将您的脚本和解释作为答案发布并接受它时,它将帮助有相同问题的用户。@Tanaike:谢谢,这只是暂时的部分答案,因为我主要需要一种恢复中断下载大文件的方法。
--- googleapiclient/http.py.orig 2019-08-05 12:24:31.000000000 -0700
+++ googleapiclient/http.py 2020-01-19 18:31:56.785404831 -0800
@@ -632,7 +632,7 @@
"""
@util.positional(3)
- def __init__(self, fd, request, chunksize=DEFAULT_CHUNK_SIZE):
+ def __init__(self, fd, request, chunksize=DEFAULT_CHUNK_SIZE, start=0):
"""Constructor.
Args:
@@ -646,7 +646,7 @@
self._request = request
self._uri = request.uri
self._chunksize = chunksize
- self._progress = 0
+ self._progress = start
self._total_size = None
self._done = False