league/flysystem-aws-s3-v3读取自定义metadata找不到addPlugin方法如何解决
问题原因
你找不到League\Flysystem\Filesystem::addPlugin()方法的核心原因是你使用的Flysystem版本为v2及以上版本,该版本已经移除了v1专属的插件系统,你查阅的v1版本文档不再适用。
此外AWS S3的ListObjects系列接口本身不会返回对象的自定义元数据,只有单独调用HEAD接口拉取单个对象属性时才会返回自定义字段,所以listContents默认无法直接拿到自定义元数据。
解决方案
适用v2/v3版本(当前主流版本)
- 初始化S3适配器时声明自定义元数据字段
创建AwsS3V3Adapter实例时,通过metadata参数传入你自定义的元数据键名,适配器会自动在调用HEAD接口时提取对应字段:
$adapter = new League\Flysystem\AwsS3V3\AwsS3V3Adapter( $s3Client, $yourBucketName, '', // 可选路径前缀,不需要留空即可 metadata: ['Generated'] ); $filesystem = new League\Flysystem\Filesystem($adapter);
- 遍历文件列表逐个拉取元数据
拿到listContents的结果后,逐个调用getMetadata方法获取单个文件的完整元数据:
$allFiles = $filesystem->listContents('/path/', true)->toArray(); foreach ($allFiles as $file) { if ($file->isDir()) continue; $metadata = $filesystem->getMetadata($file->path()); // 自定义元数据存储在extraMetadata字段中 $generated = $metadata->extraMetadata()['Generated'] ?? 'false'; // 后续业务逻辑 }
适用v1版本
如果你需要使用v1版本的getWithMetadata插件,先确认你的composer依赖中flysystem版本为1.x系列:
"league/flysystem": "^1.1"
安装对应版本后即可调用addPlugin方法加载插件:
// 加载插件 $filesystem->addPlugin(new League\Flysystem\Plugin\GetWithMetadata()); // 指定要读取的元数据字段 $fileInfo = $filesystem->getWithMetadata('/test/image.jpg', ['Generated']); $generated = $fileInfo['Generated'] ?? 'false';
注意:AWS S3会自动为所有自定义元数据添加x-amz-meta-前缀,Flysystem适配器会自动处理该前缀,你不需要在声明元数据字段时额外添加前缀,注意键名大小写敏感即可
内容的提问来源于stack exchange,提问作者daniele m
相关产品推荐
相关产品推荐

