gpt4 book ai didi

php - SonataMediaBundle 的公共(public)和私有(private)媒体上传到不同的文件夹(网络和私有(private))

转载 作者:搜寻专家 更新时间:2023-10-31 21:05:11 27 4
gpt4 key购买 nike

我正在使用 SonataMediaBundle,直到现在我一直在 Symfony 的 web 文件夹中公开上传文件。这是我的配置文件的一部分:

contexts:
default: # the default context is mandatory
providers:
- sonata.media.provider.dailymotion
- sonata.media.provider.youtube
- sonata.media.provider.image
- sonata.media.provider.file
- sonata.media.provider.vimeo

formats:
small: { width: 100 , quality: 70}
big: { width: 500 , quality: 70}
profile_pics: # the default context is mandatory
providers:
- sonata.media.provider.dailymotion
- sonata.media.provider.youtube
- sonata.media.provider.image
- sonata.media.provider.file
- sonata.media.provider.vimeo

formats:
small: { width: 100 , quality: 70}
big: { width: 500 , quality: 70}

cdn:
server:
path: %cdn_server_path% # http://media.sonata-project.org/

filesystem:
local:
directory: %kernel.root_dir%/../web/uploads/media
create: false

在我的 parameters.yml 中,我有 cdn_server_path:/uploads/media/

这将在 web/uploads/media/contextname/0001/01/*** 中上传文件。

在公用文件夹中,这些文件对所有人都可见。我知道我可以在 app/Resources/ 中的某处更改此文件夹,但这会使我的所有文件成为私有(private)文件,这是我不想要的。对于私有(private),我的意思是它们应该以某种方式由 Controller 提供服务。

我如何区分一些文件是公开的而另一些是私有(private)的?有没有办法让某个上下文上传文件不同于另一个?还是其他方式?

此外,当上传文件到 app/Resources 文件夹时,由于其 url 变为 http://website.com/app/Resources/media/profile_pics/0001/01/85e05ab9685b1745af4e64ff98ef91eed6e4ccdf.jpeg,因此无法预览。这不是公开的,因为它不在 web 文件夹中,这是 Symfony 唯一的公开文件。如何做到这一点?

编辑:我已经成功完成了上传部分(检查下面的答案),但检索部分有点麻烦。我仍在寻找一种方法。

最佳答案

好的,我快到了。我的文件正在上传到我想要的任何文件夹,但我无法显示它们。

想法是创建一个自定义提供程序,它有自己的文件系统和适配器服务。问题是我需要将要上传文件的文件夹传递给适配器服务。该适配器被传递给文件系统,然后文件系统被传递给提供者。 SonataMediaBundle 的问题在于它不允许您修改适配器的目录,因此您必须创建自己的目录并将其一直传递给您的提供商。

服务:

sonata.media.provider.private:
class: MedAppBundle\Services\PrivateFilesProvider
tags:
- { name: sonata.media.provider }
arguments: [%private_provider_name%,@medapp_private.filesystem,@sonata.media.cdn.server,@sonata.media.generator.default,@sonata.media.thumbnail.format]
medapp_private.filesystem:
class: MedAppBundle\Services\PrivateFilesystem
arguments: [@medapp_private.adapter]
medapp_private.adapter:
class: MedAppBundle\Services\PrivateFileAdapter
arguments: [%private_filesystem_directory%,true]

参数.yml

private_filesystem_directory: %kernel.root_dir%/Resources/media
private_provider_name: sonata.media.provider.private

自定义适配器

use Sonata\MediaBundle\Filesystem\Local;

class PrivateFileAdapter extends Local
{

}

文件系统

use Gaufrette\Filesystem;

class PrivateFilesystem extends Filesystem
{

}

最后,提供者

use Application\Sonata\MediaBundle\Entity\Media;
use Gaufrette\Filesystem;
use Sonata\MediaBundle\CDN\CDNInterface;
use Sonata\MediaBundle\Generator\GeneratorInterface;
use Sonata\MediaBundle\Provider\FileProvider;

use Sonata\MediaBundle\Thumbnail\ThumbnailInterface;

class PrivateFilesProvider extends FileProvider
{

public function getPrivateMedia(Media $media)
{
// $path = $this->generatePublicUrl($media, 'reference');
// $ppath = $this->generatePrivateUrl($media, "reference");
$content = $this->getReferenceFile($media)->getContent();
header('Content-Type: ' . $media->getContentType());


return 'data:' . $media->getContentType() . ';base64,' . base64_encode($content);

}
}

然后,将此提供程序添加到您的任何 sonata_media 上下文中。我已将其添加到默认上下文中,例如:

sonata_media:
db_driver: doctrine_orm
default_context: default
contexts:
default:
providers:
- sonata.media.provider.dailymotion
- sonata.media.provider.youtube
- sonata.media.provider.image
- sonata.media.provider.file
- sonata.media.provider.vimeo
- sonata.media.provider.private

在私有(private)文件夹中创建新媒体:

$media = new Media();        
$media->setBinaryContent($file);
$media->setContext('default');
$media->setProviderName('sonata.media.provider.private');
$this->em->persist($media);
$this->em->flush();

$file 是来自您的表单的文件内容。这将创建将在其中上传文件的文件夹 app\Resources\media\default\0001\01

现在的问题是检索它们,因为它们没有公共(public)链接并且需要在 Controller 中检索。我在提供程序中创建了一个 getPrivateMedia() 方法,但它没有按预期工作。

编辑:注意到服务也可以这样定义:

sonata.media.provider.private:
class: MedAppBundle\Services\PrivateFilesProvider
tags:
- { name: sonata.media.provider }
arguments: [%private_provider_name%,@medapp_private.filesystem,@sonata.media.cdn.server,@sonata.media.generator.default,@sonata.media.thumbnail.format,%kernel.root_dir%]

medapp_private.filesystem:
class: Gaufrette\Filesystem
arguments: [@medapp_private.adapter]

medapp_private.adapter:
class: Sonata\MediaBundle\Filesystem\Local
arguments: [%private_filesystem_directory%,true]

无需为提供者创建自定义文件系统或适配器,只需创建新服务并将目录传递给适配器,然后将适配器传递给文件系统,再将文件系统传递给自定义提供者。这是在您不需要任何自定义功能的情况下。

关于php - SonataMediaBundle 的公共(public)和私有(private)媒体上传到不同的文件夹(网络和私有(private)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33763512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com