我正在使用 Symfony3 和 KnpGaufretteBundle 连接到 Amazon S3 存储桶,并使用他们的 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: TestBundleFilesystemFileManager
arguments:
filesystem: "@images_fs"
filesystem_name: "images"
mimetypes: ["image/jpeg", "image/png", "image/gif"]
类:
<?php
namespace TestBundleFilesystem;
use SymfonyComponentHttpFoundationFileUploadedFile;
use SymfonyComponentHttpFoundationBinaryFileResponse;
use GaufretteFilesystem;
use GaufretteStreamWrapper;
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 );
}
}
我能够使用上传功能成功上传到存储桶,告诉我文件系统存在并且工作正常。
但是,我无法使用Gaufrette\StreamWrapper使用BinaryFileResponse提供文件,因为它说我应该这样做。相反,它给了我我在标题中输入的错误:There is no filesystem defined for the "images" domain.
文件系统肯定存在,因为我用它来上传图像。任何关于阻止我使用该文件系统的问题的线索都将非常有帮助。据我所知,Gaufrette 文档在网上真的很稀疏,但我会继续挖掘。
查看 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, ... ]
上面的代码现在可以工作了。