Используйте предварительно подписанный URL-адрес S3 с VichUploader

Я могу использовать пакет PHP Symfony Vich-Uploader для загрузки файлов в частную корзину в Amazon S3 через адаптер php sdk Flysystem.

Как я могу получить подписанный / предварительно подписанный URL-адрес для ключа после загрузки?

Я могу загрузить плагин в Flysystem, но Vich не будет использовать _ 1_ метод.

Поддерживается ли это каким-либо образом? Или какой класс следует расширить и зарегистрировать, чтобы правильно вызвать метод presignedURL?


person Kamafeather    schedule 14.04.2020    source источник
comment
В итоге я расширил VichUploader FlysystemStorage, переопределил метод resolveUri на return $filesystem->getPresignedUrl($path), а затем переопределил vich_uploader.storage.flysystem с пользовательским классом хранения на services.yaml.   -  person Kamafeather    schedule 15.04.2020


Ответы (1)


Прямого пути в VichUploader нет, но можно указать Symfony использовать собственное хранилище и добавить туда логику плагина.

Установите плагин предварительно подписанных URL-адресов для Flysystem

composer require sistemi-etime/flysystem-plugin-aws-s3-v3

Используйте плагин с Flysystem через пакет oneup_flysystem.yaml config:

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'

Исправить автоподключение (почему? ????‍♂️)

[Изменить: вот почему] < / em>

Кроме того, мне пришлось явно указать псевдоним аргументов, необходимых для FlysystemStorage, чтобы Symfony Autowire инициализировал пользовательское хранилище:

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 и

Если кто-нибудь знает, как пропустить это исправление, прокомментируйте.

person Kamafeather    schedule 15.04.2020