【问题标题】:Gaufrette and Symfony 2: There is no filesystem defined for the "images" domainGaufrette 和 Symfony 2:没有为“图像”域定义文件系统
【发布时间】:2016-10-01 07:47:11
【问题描述】:

我正在使用带有 KnpGaufretteBundle 的 Symfony3 以通过其 Github 自述文件中概述的 AWS S3 方法连接到 Amazon S3 存储桶

aws_s3_adapter:
  key:        "%aws_key%"
  secret_key: "%aws_secret%"
  region:     "%aws_region%"

knp_gaufrette:
  adapters:
    images:
        aws_s3:
            service_id: 'aws_s3_adapter.client'
            bucket_name: '%aws_bucket%'
            options:
                directory: 'images'
  filesystems:
    images:
        adapter: images
        alias:   images_fs

我还定义了一个服务,我想用它来管理这个文件系统(和其他)。

定义:

services:
  test.image_manager:
    class: TestBundle\Filesystem\FileManager
    arguments: 
      filesystem: "@images_fs"
      filesystem_name: "images"
      mimetypes: ["image/jpeg", "image/png", "image/gif"]

类:

<?php

namespace TestBundle\Filesystem;

use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

use Gaufrette\Filesystem;
use Gaufrette\StreamWrapper;

class FileManager
{
    private $allowedMimeTypes;

    private $filesystem;

    private $filsystem_name;

    public function __construct(Filesystem $filesystem, $filesystem_name, $mimetypes = array())
    {
        $this->filesystem = $filesystem;
        $this->filesystem_name = $filesystem_name;
        $this->allowedMimeTypes = $mimetypes;
    }

    public function upload(UploadedFile $file, $filename)
    {
        // Check if the file's mime type is in the list of allowed mime types.
        if (!in_array($file->getClientMimeType(), $this->allowedMimeTypes)) {
            throw new \InvalidArgumentException(sprintf('Files of type %s are not allowed.', $file->getClientMimeType()));
        }

        $adapter = $this->filesystem->getAdapter();
        $adapter->setMetadata($filename, array('contentType' => $file->getClientMimeType()));
        return $adapter->write($filename, file_get_contents($file->getPathname()));
    }

    public function fetch( $filename )
    {
        if( ! $this->filesystem->has( $filename ) )
        {
            return false;
        }


        /* -- PROBLEM -- */

        StreamWrapper::register();
        return new BinaryFileResponse( "gaufrette://{$this->filesystem_name}/{$filename}" );

        /* -- PROBLEM -- */

    }

    public function delete( $filename )
    {
        if( ! $this->filesystem->has( $filename ) )
        {
            return false;
        }
        return $this->filesystem->delete( $filename );
    }
}

我可以使用上传功能成功上传到bucket,告诉我文件系统存在并且工作正常。

但是,我不能使用 Gaufrette\StreamWrapper 来使用 BinaryFileResponse 提供文件,因为它说我应该这样做。相反,它给了我我在标题中输入的错误:There is no filesystem defined for the "images" domain.

文件系统确实存在,因为我正在使用它来上传图像。关于可能是什么问题阻止我使用该文件系统的任何线索都会非常有帮助。就我所发现的而言,Gaufrette 文档在网上非常稀少,但我会继续挖掘。

【问题讨论】:

    标签: php amazon-s3 symfony gaufrette


    【解决方案1】:

    查看MainConfiguration.php 表明捆绑包的配置中有一个steam_wrapper 选项。我将此添加到我的config.yml 中,文件系统的定义如下:

    knp_gaufrette:
      adapters:
        images:
            aws_s3:
                service_id: 'aws_s3_adapter.client'
                bucket_name: '%aws_bucket%'
                options:
                    directory: 'images'
        .
        .
        .
      filesystems:
        images:
            adapter: images
            alias:   images_fs
        .
        .
        .
      stream_wrapper:
        filesystems: [ images, ... ]
    

    上面的代码现在可以工作了。

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2019-09-23
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      相关资源
      最近更新 更多