使用Python SDK时如何防止GCS自动解压对象?
Posted
技术标签:
【中文标题】使用Python SDK时如何防止GCS自动解压对象?【英文标题】:How to prevent GCS from automatically decompressing objects when using Python SDK? 【发布时间】:2021-05-28 20:13:58 【问题描述】:我正在尝试在 GCS 中下载一个压缩的对象,但如果没有 GCS 自动为我解压缩文件,我将无法下载它。我希望能够自己下载gzip,然后在本地解压。
如果我在 GCS gui 中转到我的对象,我可以查看对象元数据并看到以下内容:
Content-Type: application/json
Content-Encoding: gzip
Cache-Control: no-transform
另外,如果我右键单击控制台中的Authenticated URL
并单击Save Link As
,我会得到一个 gzip 存档,所以我知道这个文件实际上是一个存档。
我在GCS's documentation 上读到,您可以设置Cache-Control: no-transform
然后“该对象在所有后续请求中作为压缩对象提供”。
除了我使用下面的代码下载 GCS 对象时,它是作为 JSON 对象下载的,而不是作为 gzip 存档:
bucket = storage_client.get_bucket("bucketname")
blob = bucket.blob("objectname")
stringobj = blob.download_as_text()
bytesobj = blob.download_as_bytes()
blob.download_to_filename("test.json.gz")
我尝试了三种不同的方法来下载对象,它们都将文件下载为 JSON 对象。
只是为了验证该对象确实具有正确的标题,我运行了以下内容:
blob.reload()
print(f"Content encoding: blob.content_encoding")
print(f"Content type: blob.content_type")
print(f"Cache control: blob.cache_control")
>> Content encoding: gzip
>> Content type: application/json
>> Cache control: no-transform
我不确定我还能尝试什么。
【问题讨论】:
你的问题是Content-Encoding
:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…你可以删除那个标题,而是应用Content-Type: application/gzip
。
@JohnHanley 我不确定我是否同意这实际上是一个问题。根据 Google 的文档,我设置它的方式 gives the most information about the state of the object to anyone accessing it. Doing so also makes the object eligible for decompressive transcoding when it is later downloaded, allowing client applications to handle the semantics of the Content-Type correctly.
它还说 If the Cache-Control metadata field for the object is set to no-transform, the object is served as a compressed object in all subsequent requests..
因此根据他们的文档,在Cache-Control
标头上设置no-transform
应该可以防止发生解压缩转码。
例如,Web 服务器、代理等可以为客户端处理文件。服务器可以应用压缩,因此它添加了标题Content-Encoding
,这意味着它转换了原始对象。客户端(浏览器)现在知道取消转换对象。在你的情况下,解压缩它。 The Content-Encoding representation header lists any encodings that have been applied to the representation (message payload), and in what order. This lets the recipient know how to decode the representation in order to obtain the original payload format
【参考方案1】:
我重现了您的问题。当我下载了一个文件名具有 .gz 扩展名的 gzip 存档时,我遵循了您的输入并得到了类似的行为。但是,gunzip
-ing 文件返回错误:
Example.json.gz: not in gzip format
解决办法是使用raw_download=True
下载原始gzip压缩包,防止发生解压转码。
例子:
blob.download_to_filename("test.json.gz", raw_download=True)
【讨论】:
以上是关于使用Python SDK时如何防止GCS自动解压对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中创建从 Pub/Sub 到 GCS 的数据流管道