将 S3 预签名 URL 与 VichUploader 一起使用
Use S3 presigned URL with VichUploader
我可以使用 PHP Symfony bundle Vich-Uploader 通过 php sdk 将文件上传到 Amazon S3 中的 private bucket Flysystem 适配器。
上传后如何获得密钥的 signed/presigned URL?
我可以将插件加载到Flysystem,但是Vich不会使用$filesystem->getPresignedUrl('/tmp/some/target')
方法。
捆绑包是否以任何方式支持它?或者应该扩展和注册什么 class 才能正确调用 presignedURL 方法?
没有直接进入 VichUploader 的方法,但可以告诉 Symfony 使用自定义存储并在其中添加插件逻辑。
为 Flysystem 安装预签名 URL 插件
composer require sistemi-etime/flysystem-plugin-aws-s3-v3
通过捆绑包 oneup_flysystem.yaml
配置将插件与 Flysystem 一起使用:
oneup_flysystem:
filesystems:
aws_s3:
...
...
plugins:
- s3.plugin.presigned_url
定义您自己的存储
<?php
use Vich\UploaderBundle\Storage\FlysystemStorage;
class CustomFlysystemStorage extends FlysystemStorage
{
// Copy the parent method code but then return the presigned URL
public function resolveUri($obj, ?string $fieldName = null, ?string $className = null)
{
[$mapping, $filename] = $this->getFilename($obj, $fieldName, $className);
if (empty($filename)) {
return null;
}
$dir = $mapping->getUploadDir($obj);
$path = !empty($dir) ? $dir.'/'.$filename : $filename;
$fs = $this->getFilesystem($mapping, $obj, $fieldName, $className);
return $fs->getPresignedUrl($path);
}
}
在里面使用它 services.yaml
:
# alias the custom storage to be used instead of the one defined by VichUploader
vich_uploader.storage.flysystem: '@Your\Own\Namespace\CustomFlysystemStorage'
修复自动装配(为什么?♂️)
[编辑:that's why]
此外,为了让 Symfony Autowire 初始化自定义存储,我不得不 明确地为 FlysystemStorage
所需的参数指定别名 :
Vich\UploaderBundle\Mapping\PropertyMappingFactory: '@vich_uploader.property_mapping_factory'
League\Flysystem\MountManager: '@oneup_flysystem.mount_manager'
虽然我不确定为什么这是必要的。
我希望 vich_uploader.property_mapping_factory
和 oneup_flysystem.mount_manager
已经被 VichUploaderBundle and OneupFlysystemBundle
的配置定义和别名
如果有人知道如何跳过此修复,请发表评论。
我可以使用 PHP Symfony bundle Vich-Uploader 通过 php sdk 将文件上传到 Amazon S3 中的 private bucket Flysystem 适配器。
上传后如何获得密钥的 signed/presigned URL?
我可以将插件加载到Flysystem,但是Vich不会使用$filesystem->getPresignedUrl('/tmp/some/target')
方法。
捆绑包是否以任何方式支持它?或者应该扩展和注册什么 class 才能正确调用 presignedURL 方法?
没有直接进入 VichUploader 的方法,但可以告诉 Symfony 使用自定义存储并在其中添加插件逻辑。
为 Flysystem 安装预签名 URL 插件
composer require sistemi-etime/flysystem-plugin-aws-s3-v3
通过捆绑包 oneup_flysystem.yaml
配置将插件与 Flysystem 一起使用:
oneup_flysystem:
filesystems:
aws_s3:
...
...
plugins:
- s3.plugin.presigned_url
定义您自己的存储
<?php
use Vich\UploaderBundle\Storage\FlysystemStorage;
class CustomFlysystemStorage extends FlysystemStorage
{
// Copy the parent method code but then return the presigned URL
public function resolveUri($obj, ?string $fieldName = null, ?string $className = null)
{
[$mapping, $filename] = $this->getFilename($obj, $fieldName, $className);
if (empty($filename)) {
return null;
}
$dir = $mapping->getUploadDir($obj);
$path = !empty($dir) ? $dir.'/'.$filename : $filename;
$fs = $this->getFilesystem($mapping, $obj, $fieldName, $className);
return $fs->getPresignedUrl($path);
}
}
在里面使用它 services.yaml
:
# alias the custom storage to be used instead of the one defined by VichUploader
vich_uploader.storage.flysystem: '@Your\Own\Namespace\CustomFlysystemStorage'
修复自动装配(为什么?♂️)
[编辑:that's why]
此外,为了让 Symfony Autowire 初始化自定义存储,我不得不 明确地为 FlysystemStorage
所需的参数指定别名 :
Vich\UploaderBundle\Mapping\PropertyMappingFactory: '@vich_uploader.property_mapping_factory'
League\Flysystem\MountManager: '@oneup_flysystem.mount_manager'
虽然我不确定为什么这是必要的。
我希望 vich_uploader.property_mapping_factory
和 oneup_flysystem.mount_manager
已经被 VichUploaderBundle and OneupFlysystemBundle
如果有人知道如何跳过此修复,请发表评论。