GAE Python GCS文件名访问旧文件

时间:2015-01-13 14:06:47

标签: python google-app-engine google-cloud-storage

在我的GAE Python应用程序中,我正在编写代码以在GCS中存储图像。

我按如下方式编写图像:

bucket_name = os.environ.get(u'BUCKET_NAME', app_identity.get_default_gcs_bucket_name())
filename = u'/{}/{}/image'.format(bucket_name, str(object.key.id()))
mimetype = self.request.POST[u'image_file'].type
gcs_file = cloudstorage.open(filename, 'w', content_type=mimetype,
                                    options={'x-goog-acl': 'public-read'})
gcs_file.write(self.request.get(u'image_file'))
gcs_file.close()

我第一次使用此代码编写特定文件名时,我可以使用其文件名访问该文件:

https://storage.googleapis.com/<app>.appspot.com/<id>/image

我还可以在GCS存储浏览器上单击名称“image”并查看图像。

耶!这一切似乎都有效。

但是当我将不同的图像上传到相同的文件名时,会发生一些令人困惑的事情:当我在浏览器中显示文件名时,通过&lt; img&gt;标记或作为单独浏览器标签中的网址, 显示旧图像。 然而,当我通过GCS存储浏览器显示“图像”时, 它显示新图片。

顺便说一下,作为一个额外的数据点,虽然我在打开文件进行写入时指定public-read,但在GCS存储浏览器页面上该文件的“公共共享”列为空。

我尝试在open语句之前删除该文件,即使w应该用作覆盖,但它没有任何区别。

任何人都可以解释文件名如何继续访问旧版本的文件,即使GCS存储浏览器显示新版本,更重要的是,我需要做些什么来使文件名访问新版本?

编辑:

继续研究这个问题,我在https://cloud.google.com/storage/docs/accesscontrol发现了以下声明:

If you need to ensure that updates become visible immediately, you should set
a Cache-Control header of "Cache-Control:private, max-age=0, no-transform" on
such objects.

但是,我无法看到如何使用Cloudstorage“open”命令或以任何其他方式从我的Python程序中执行此操作。因此,如果这是解决方案,有人可以告诉我如何为我正在创建的这些图像文件设置Cache-Control标头吗?

1 个答案:

答案 0 :(得分:3)

以下是打开设置缓存控件的示例:

with gcs.open(new_zf.gcs_filename, 'w', content_type=b'multipart/x-zip',
                  options={b'x-goog-acl': b'public-read', b'cache-control': b'private, max-age=0, no-cache'}) as nzf:

取自this respository