Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用google drive python API分块部分下载_Python_Google Drive Api - Fatal编程技术网

使用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
忽略用户提供的HTTP
Range
。一个范围,指定如下:

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