设置Google Storage Bucket的默认缓存控件

Rez*_*azi 5 google-cloud-storage

有什么方法可以设置存储桶的默认缓存控件(public, max-age=3600每次创建新对象时都尝试覆盖存储桶级别)

类似于defacl,但设置缓存控件

小智 18

如果有人仍在寻找答案,则需要在添加 blob 时设置元数据。对于那些谁想要更新在桶中的所有现有对象的元数据,你可以使用setmetagsutil- https://cloud.google.com/storage/docs/gsutil/commands/setmeta

您只需要执行以下操作:

gsutil setmeta -r -h "Cache-control:public, max-age=12345" gs://bucket_name
Run Code Online (Sandbox Code Playgroud)

  • 添加 `gsutil -m` 以并行运行多个文件 (6认同)

ano*_*789 6

可以编写Google Cloud Storage Trigger

此函数为存储桶中的每个新对象设置Cache-Control元数据字段:

from google.cloud import storage

CACHE_CONTROL = "private"

def set_cache_control_private(data, context):
    """Background Cloud Function to be triggered by Cloud Storage.
       This function changes Cache-Control meta data.

    Args:
        data (dict): The Cloud Functions event payload.
        context (google.cloud.functions.Context): Metadata of triggering event.
    Returns:
        None; the output is written to Stackdriver Logging
    """

    print('Setting Cache-Control to {} for: gs://{}/{}'.format(
            CACHE_CONTROL, data['bucket'], data['name']))
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(data['bucket'])
    blob = bucket.get_blob(data['name'])
    blob.cache_control = CACHE_CONTROL
    blob.patch()
Run Code Online (Sandbox Code Playgroud)

您还需要一个requirements.txt文件,用于在同一目录中导入存储。在需求中有google-cloud-storage软件包:

google-cloud-storage==1.10.0
Run Code Online (Sandbox Code Playgroud)

您必须将功能部署到特定存储桶:

gcloud beta functions deploy set_cache_control_private \
    --runtime python37 \
    --trigger-resource gs://<your_bucket_name> \
    --trigger-event google.storage.object.finalize
Run Code Online (Sandbox Code Playgroud)

出于调试目的,您还可以使用gcloud命令检索日志:

gcloud functions logs read --limit 50
Run Code Online (Sandbox Code Playgroud)


jte*_*ace 5

无法指定默认缓存控制。必须在创建对象时设置。

  • 我希望 Google 将其添加为存储桶选项,以便为公共项目设置全局缓存控制。默认的 1 小时并不总是理想的。 (12认同)
  • 典型的谷歌不知道普通人需要什么 (5认同)

pro*_*mes 5

我知道这是一个很老的问题,并且您正在执行默认操作(我不确定是否存在),但是在经历了很多挫折之后,以下内容在最近的 PHP 项目中为我工作:

$object = $bucket->upload($tempFile, [
            'predefinedAcl' => "PUBLICREAD",
            'name' => $destination,
            'metadata' => [
                'cacheControl' => 'Cache-Control: private, max-age=0, no-transform',
            ]
        ]);
Run Code Online (Sandbox Code Playgroud)

同样可以应用于节点:

const storage = new Storage();

const bucket = storage.bucket(BUCKET_NAME);

const blob = bucket.file(FILE_NAME);

const uploadProgress = new Promise((resolve, reject) => {
    const blobStream = blob.createWriteStream();

    blobStream.on('error', err => {
      reject(err);

      throw new Error(err);
    });

    blobStream.on('finish', () => {
      resolve();
    });

    blobStream.end(file.buffer);
});

await uploadProgress;

if (isPublic) {
  await blob.makePublic();
}

blob.setMetadata({ cacheControl: 'public, max-age=31536000' });
Run Code Online (Sandbox Code Playgroud)


san*_*des 5

使用 gsutil

  • -h:允许您指定某些 HTTP 标头
  • -r : 递归
  • -m:执行一系列可能运行得更快的 gsutil 操作。

gsutil -m setmeta -r -h "Cache-control:public, max-age=259200" gs://bucket-name