簡體   English   中英

使用 google-cloud-storage Python 客戶端獲取下載標頭?

[英]Get download headers with google-cloud-storage Python client?

當我使用google-cloud-storage Python 客戶端下載 Google Cloud Storage blob 時,如何獲取它的標頭(特別是content-lengthetagcontent-typelast-modified )?

具體來說,我的代碼如下所示:

client = Client()
bucket = client.get_bucket('my-bucket')
blob = bucket.blob('my-blob')
with open('some-file', 'w') as f:
  blob.download_to_file(f)

我想在下載 blob 時發送標頭( content-lengthetag等)。

注意:

  1. 使用blob.size (和朋友)需要調用blob.reload() ,這會發出一個 HTTP 請求(並且一旦 blob 被下載,它們就不會自動填充;見評論)
  2. 使用requests.get(blob.generate_signed_url()) (或類似的)意味着我不能利用Client的連接池

那么,在不發出任何額外的 HTTP 請求的情況下,有沒有辦法在使用google-cloud-storage庫從 Cloud Storage 下載文件時獲取標頭?

不可能通過 Python 客戶端或任何其他客戶端在一個請求中同時檢索對象數據和對象元數據。

如果我們查看 Google Cloud Storage (GCS) 公開的 API,我們會發現檢索對象內容的 API 記錄在 Objects -> Get here 下 這描述了對以下內容的調用:

GET https://storage.googleapis.com/storage/v1/b/bucket/o/object

如果我們查看此請求可用的參數,我們會發現一個名為alt的參數,它有兩個選項:

  • json (默認)
  • media

在文檔的末尾,有進一步的評論:

默認情況下,這會在響應正文中使用對象資源進行響應。 如果您提供 URL 參數alt=media ,則它將使用響應正文中的對象數據進行響應。

仔細閱讀這一點,似乎可以檢索或者元數據內容...但不能同時使用。 由於 REST API 是構建所有其他庫所依據的底層 API,如果沒有底層 REST API 來檢索單個請求中的內容和元數據,那么將沒有更高級別的 API 來實現這一點。

如前所述,Python 庫不允許同時設置標題和正文。

這是因為reload 函數api_request獲取響應對象。

response = client._connection.api_request(
        method="GET", path=self.path, query_params=query_params)
self._set_properties(api_response)

但是,函數download_to_filedownload_to_filenamedownload_as_string使用另一個直接寫入 IO 緩沖區的函數_do_download 並且不返回響應對象。

此后一個函數使用您提到的Client池,但未提供更新 blob 對象屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM