【问题标题】:Set Google Storage Bucket's default cache control设置 Google Storage Bucket 的默认缓存控制
【发布时间】:2015-11-15 19:48:12
【问题描述】:

有没有办法设置Bucket的默认缓存控制(每次创建新对象时都试图覆盖bucket级别的public, max-age=3600

类似于defacl,但设置了缓存控制

【问题讨论】:

    标签: google-cloud-storage


    【解决方案1】:

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

    您只需要执行以下操作:

    gsutil setmeta -r -h "Cache-control:public, max-age=12345" gs://bucket_name
    

    【讨论】:

    • 确保 IAM 用户有足够的权限。例如。 “角色:存储对象管理员”或适合该场合的任何级别。
    • 添加gsutil -m 以并行运行多个文件?
    【解决方案2】:

    可以写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()
    

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

    google-cloud-storage==1.10.0
    

    您必须将函数部署到特定的存储桶:

    gcloud beta functions deploy set_cache_control_private \
        --runtime python37 \
        --trigger-resource gs://<your_bucket_name> \
        --trigger-event google.storage.object.finalize
    

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

    gcloud functions logs read --limit 50
    

    【讨论】:

      【解决方案3】:

      使用 gsutil

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

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

      【讨论】:

      • 这是最简单的方法。
      【解决方案4】:

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

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

      同样可以应用于节点:

      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' });
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我希望 Google 将其添加为存储桶选项,以便为公共项目设置全局缓存控制。并不总是需要默认的 1 小时。
        • 典型的谷歌不知道普通人需要什么
        【解决方案6】:

        如果您使用的是 python 应用程序,则可以使用 app.yaml 中的选项“default_expiration”为Cache-Control 标头设置全局默认值:https://cloud.google.com/appengine/docs/standard/python/config/appref

        例如:

        runtime: python27   
        api_version: 1   
        threadsafe: yes
        
        default_expiration: "30s"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-01
          • 2020-02-17
          • 2019-04-13
          • 1970-01-01
          • 2014-10-28
          • 2020-12-16
          • 2013-01-07
          • 2017-05-10
          相关资源
          最近更新 更多