Flysystem:Google云存储适配器-缓存控制



在使用Google Cloud Storage Adapter for Flysystem将文件放入Google Cloud Storage时,是否有方法设置缓存控制元数据?

我把所有的文件都放在公共存储桶中,但有时我需要更新一些文件,之后我仍然会看到旧文件。我认为这在一般情况下是可能的,但我认为Flysystem没有办法做到这一点,我们在任何地方都使用它。

Flysystem能够设置适配器配置。要设置GCP存储桶的缓存控制头,您可以使用下一个:

/** @var FilesystemInterface $storage */
$storage->put($path, $contents, [
'metadata' => [
'cacheControl' => 'no-cache,max-age=0'
]
]);

此外,您可以在GCP控制台中设置Cloud Function,以在对象保存到bucket 时设置标题

您可以在Google Cloud Storage Object上对Set cache control PHP客户端的回复中找到一个设置缓存控制的PHP示例。

有几种方法可以实现

  1. 在GSC sonsole上手动(每个文件中的"编辑元数据"(-如果您有大量文件,则解决方案不好

  2. 使用gsutil 上传

    gsutil -m -D -h Cache-Control:"Cache-Control:public, max-age=31536000" cp -r <path to your folder> gs://yourbucketname/optionalfolder/
    
  3. 更新元参考

    gsutil -m setmeta -h "Content-Type:text/html" 
    -h "Cache-Control:public, max-age=3600" 
    -h "Content-Disposition" gs://bucket/*.html
    
  • 使用API上传(PHP、Nodejs、Java、GO等(请参阅SDK文档-每种语言都有很多示例。

  • 创建Google负载均衡器并设置自定义元字段";高速缓存控制":"公众,最大年龄=3600";在这种情况下,您将拥有自己的CDN域名和灵活的设置

  • [最佳选项]-创建并部署触发器脚本,该脚本将设置meta(或您想要的任何内容https://googleapis.dev/nodejs/storage/latest/File.html)上传后立即(google.storage.object.finalize事件(

  • 使用index.jspackage.json两个文件创建新文件夹

    index.js

    enter const {Storage} = require('@google-cloud/storage');
    const storage = new Storage();
    exports.prepare = (file, context) => {
    console.log("prepare: set cache control:" + file.name);
    storage.bucket(file.bucket).file(file.name).setMetadata({cacheControl: 'public, max-age=31536000'}); 
    };
    

    package.json

    {
    "dependencies": {
    "@google-cloud/storage": ">=5.8.0"
    }
    }
    

    并分两步部署此功能

    1. 安装并初始化云(https://cloud.google.com/sdk/docs/install)

      gcloud init
      
    2. deploy(它将要求先启用api-遵循说明(

      gcloud functions deploy prepare 
      --runtime nodejs12 
      --trigger-resource gs://yourbacketname 
      --trigger-event google.storage.object.finalize
      

    最新更新