Загрузка из облачного хранилища Google с клиентской библиотекой API завершается неудачно с использованием HTTP 416 - PullRequest
0 голосов
/ 17 мая 2019

К сожалению, я не хочу полагаться на дополнительные пакеты, кроме googleapiclient, и столкнулся с некоторой проблемой при загрузке объектов из корзины хранения.

from googleapiclient.http import MediaIoBaseDownload
import googleapiclient.discovery

storage_service = googleapiclient.discovery.build(
    serviceName='storage', version='v1', credentials=creds)

f = storage_service.objects()
results = f.list(bucket='MYBUCKET').execute()

for d in results['items']:
    with open(d['name']), 'wb') as fh:
        req = MediaIoBaseDownload(
            fh,
            f.get_media(bucket=d['bucket'], object=d['name'], generation=d['generation']),
            chunksize=1024*1024
        )
        done = False
        while done is False:
            status, done = req.next_chunk()

Теперь это приводит к следующей ошибке:

---------------------------------------------------------------------------
HttpError                                 Traceback (most recent call last)
<ipython-input-210-d66ce751dec5> in <module>()
      4         done = False
      5         while done is False:
----> 6             status, done = req.next_chunk()

path_to_my_env/lib/python2.7/site-packages/googleapiclient/_helpers.pyc in positional_wrapper(*args, **kwargs)
    128                 elif positional_parameters_enforcement == POSITIONAL_WARNING:
    129                     logger.warning(message)
--> 130             return wrapped(*args, **kwargs)
    131         return positional_wrapper
    132 

path_to_my_env/lib/python2.7/site-packages/googleapiclient/http.pyc in next_chunk(self, num_retries)
    703       return MediaDownloadProgress(self._progress, self._total_size), self._done
    704     else:
--> 705       raise HttpError(resp, content, uri=self._uri)
    706 
    707 

HttpError: <HttpError 416 when requesting https://www.googleapis.com/storage/v1/b/MYBUCKET/o/MYOBJECT?generation=1234&alt=media returned "Requested range not satisfiable">

Кто-нибудь знает о том, что мне где-то не хватает или как лучше загружать файлы из хранилища? Все, что я нашел, зависит от конкретных библиотек хранилища.

1 Ответ

0 голосов
/ 17 мая 2019

Похоже, что это связано с этой проблемой .

Некоторые файлы (большинство) являются 0-байтовыми файлами.

Проблема устранена с помощью следующего кода:

for d in results['items']:
    request = f.get_media(bucket=d['bucket'], object=d['name'], generation=d['generation'])
    response = request.execute()
    if response != '':
        with open(d['name']), 'wb') as fh:
            fh.write(response)
...