将 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_factoryoneup_flysystem.mount_manager 已经被 VichUploaderBundle and OneupFlysystemBundle

的配置定义和别名

如果有人知道如何跳过此修复,请发表评论。