有没有办法在使用 Google Cloud Storage Adapter for Flysystem 将文件放入 Google Cloud Storage 时设置缓存控制元数据?
我的存储桶中的所有文件都是公开的,但有时我需要更新一些文件,之后我仍然看到旧文件。我认为一般来说这是可能的,但我看不出 Flysystem 有办法做到这一点,我们到处都在使用它。
有没有办法在使用 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 以在对象保存到存储桶时设置标头
您可以在 Google Cloud Storage Object 上对 Set Cache-Control php 客户端的回复中找到设置缓存控制的 PHP 示例。
有几种方法可以做到这一点
手动在 GSC sonsole 上(每个文件中的“编辑元数据”) - 如果你有大量文件,这是一个糟糕的解决方案
使用 gsutil 上传
gsutil -m -D -h Cache-Control:"Cache-Control:public, max-age=31536000" cp -r <path to your folder> gs://yourbucketname/optionalfolder/
更新元参考
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 负载均衡器并设置自定义元字段 "Cache-Control" : "public, max-age=3600" 在这种情况下,您将拥有自己的 CDN 域名和灵活的设置
[最佳选择] - 创建和部署触发脚本,它将在上传后立即设置元(或任何你想要的https://googleapis.dev/nodejs/storage/latest/File.html)(google.storage.object.finalize 事件)
使用两个文件index.js和package.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'});
};
包.json
{
"dependencies": {
"@google-cloud/storage": ">=5.8.0"
}
}
并分两步部署此功能
安装和初始化云(https://cloud.google.com/sdk/docs/install)
gcloud init
部署(它会首先要求启用 api - 按照说明进行操作)
gcloud functions deploy prepare \
--runtime nodejs12 \
--trigger-resource gs://yourbacketname \
--trigger-event google.storage.object.finalize