def download_to_file(self, file_obj, client=None): """Download the contents of this blob into a file-like object. .. note:: If the server-set property, :attr:`media_link`, is not yet initialized, makes an additional API request to load it. Downloading a file that has been encrypted with a `customer-supplied`_ encryption key: .. literalinclude:: storage_snippets.py :start-after: [START download_to_file] :end-before: [END download_to_file] The ``encryption_key`` should be a str or bytes with a length of at least 32. .. _customer-supplied: https://cloud.google.com/storage/docs/\ encryption#customer-supplied :type file_obj: file :param file_obj: A file handle to which to write the blob's data. :type client: :class:`~google.cloud.storage.client.Client` or ``NoneType`` :param client: Optional. The client to use. If not passed, falls back to the ``client`` stored on the blob's bucket. :raises: :class:`google.cloud.exceptions.NotFound` """ client = self._require_client(client) if self.media_link is None: # not yet loaded self.reload() download_url = self.media_link # Use apitools 'Download' facility. download = Download.from_stream(file_obj) if self.chunk_size is not None: download.chunksize = self.chunk_size headers = _get_encryption_headers(self._encryption_key) request = Request(download_url, 'GET', headers) # Use ``_base_connection`` rather ``_connection`` since the current # connection may be a batch. A batch wraps a client's connection, # but does not store the ``http`` object. The rest (API_BASE_URL and # build_api_url) are also defined on the Batch class, but we just # use the wrapped connection since it has all three (http, # API_BASE_URL and build_api_url). download.initialize_download(request, client._base_connection.http)
def download_to_file(self, file_obj, client=None): """Download the contents of this blob into a file-like object. .. note:: If the server-set property, :attr:`media_link`, is not yet initialized, makes an additional API request to load it. Downloading a file that has been encrypted with a `customer-supplied`_ encryption key:: >>> from google.cloud import storage >>> from google.cloud.storage import Blob >>> client = storage.Client(project='my-project') >>> bucket = client.get_bucket('my-bucket') >>> encryption_key = 'aa426195405adee2c8081bb9e7e74b19' >>> blob = Blob('secure-data', bucket, ... encryption_key=encryption_key) >>> with open('/tmp/my-secure-file', 'wb') as file_obj: >>> blob.download_to_file(file_obj) The ``encryption_key`` should be a str or bytes with a length of at least 32. .. _customer-supplied: https://cloud.google.com/storage/docs/\ encryption#customer-supplied :type file_obj: file :param file_obj: A file handle to which to write the blob's data. :type client: :class:`~google.cloud.storage.client.Client` or ``NoneType`` :param client: Optional. The client to use. If not passed, falls back to the ``client`` stored on the blob's bucket. :raises: :class:`google.cloud.exceptions.NotFound` """ client = self._require_client(client) if self.media_link is None: # not yet loaded self.reload() download_url = self.media_link # Use apitools 'Download' facility. download = Download.from_stream(file_obj) if self.chunk_size is not None: download.chunksize = self.chunk_size headers = _get_encryption_headers(self._encryption_key) request = Request(download_url, 'GET', headers) # Use ``_base_connection`` rather ``_connection`` since the current # connection may be a batch. A batch wraps a client's connection, # but does not store the ``http`` object. The rest (API_BASE_URL and # build_api_url) are also defined on the Batch class, but we just # use the wrapped connection since it has all three (http, # API_BASE_URL and build_api_url). download.initialize_download(request, client._base_connection.http)
def download_to_file(self, file_obj, encryption_key=None, client=None): """Download the contents of this blob into a file-like object. .. note:: If the server-set property, :attr:`media_link`, is not yet initialized, makes an additional API request to load it. Downloading a file that has been encrypted with a `customer-supplied`_ encryption key:: >>> from google.cloud import storage >>> from google.cloud.storage import Blob >>> client = storage.Client(project='my-project') >>> bucket = client.get_bucket('my-bucket') >>> encryption_key = 'aa426195405adee2c8081bb9e7e74b19' >>> blob = Blob('secure-data', bucket) >>> with open('/tmp/my-secure-file', 'wb') as file_obj: >>> blob.download_to_file(file_obj, ... encryption_key=encryption_key) The ``encryption_key`` should be a str or bytes with a length of at least 32. .. _customer-supplied: https://cloud.google.com/storage/docs/\ encryption#customer-supplied :type file_obj: file :param file_obj: A file handle to which to write the blob's data. :type encryption_key: str or bytes :param encryption_key: Optional 32 byte encryption key for customer-supplied encryption. :type client: :class:`~google.cloud.storage.client.Client` or ``NoneType`` :param client: Optional. The client to use. If not passed, falls back to the ``client`` stored on the blob's bucket. :raises: :class:`google.cloud.exceptions.NotFound` """ client = self._require_client(client) if self.media_link is None: # not yet loaded self.reload() download_url = self.media_link # Use apitools 'Download' facility. download = Download.from_stream(file_obj) if self.chunk_size is not None: download.chunksize = self.chunk_size headers = {} if encryption_key: _set_encryption_headers(encryption_key, headers) request = Request(download_url, 'GET', headers) # Use the private ``_connection`` rather than the public # ``.connection``, since the public connection may be a batch. A # batch wraps a client's connection, but does not store the `http` # object. The rest (API_BASE_URL and build_api_url) are also defined # on the Batch class, but we just use the wrapped connection since # it has all three (http, API_BASE_URL and build_api_url). download.initialize_download(request, client._connection.http)