- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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/
如果需要在类外访问静态(例如单例),可以选择公共(public)静态而不是私有(private)静态,而当不需要公开函数时首选私有(private)静态(否则未命名的命名空间就可以了)——在这种情况下
在互联网上进行了一些搜索,但找不到简单的答案。我的问题集是在 Android 框架中使用 Java,但我相信这也是标准的 Java 行为。我理解 final 和 private 的定义,它们都用于变量
我有这个代码: public final class Board { private final int[][] blocks; private final int N; pr
对我来说,过去作为 Objective-C 开发人员很简单。一个类需要公开的每个字段都是一个属性,每个私有(private)字段都是一个没有 getter 或 setter 的实例变量。但我经常看到人
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个在 Docker 容器中运行的应用程序。它需要来自公司私有(private) NPM 注册表(Sinopia)的一些私有(private)模块,并且访问这些需要用户身份验证。 Dockerfi
我试图理解 C# 使用 getters 和 setters 自动声明变量与 java 声明之间的区别。 在java中我通常这样做: private int test; public int getTe
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我目前正在使用 Objective-C(适用于 iPhone)构建游戏。 为此,出于性能/复杂性原因,我略微打破了 MVC,并为 View (渲染器)提供了对模型的直接引用。这是因为它应该以 60fp
我已经在 ubuntu 上成功配置了 2 个虚拟主机站点(基于名称的虚拟主机)。我的 apache 版本是 2.2.22。 这两个站点都在本地主机上工作。 /etc/hosts 条目 127.0.0.
考虑下面的类 public class A { private final Map cache; public HeavyObject getThing(); } 假设不能泄漏对缓存
我有一个类,它有一个方法,我希望它只能被它的子对象访问,而不能被这个包中的其他类访问。 Modifier | Class | Package | Subclass | World ———————
本文实例讲述了JavaScript中的公有、私有、特权和静态成员用法。分享给大家供大家参考。具体分析如下: 下面的内容是在《JavaScript.DOM高级程序设计》里面摘抄出来的,比较容易理解,
我有一个用例,我已将其简化为以下程序: public class A { private int x = 100; class B { private int y = ne
问题: 类声明如下: class Select { public: template static Iterator function(Iterator , Iterator , bo
我是一名初级 PHP 程序员。我还有很多东西要学。这就是我问这个问题的原因。在一个类中,您有一个公共(public)函数,您可以从该类外部调用它。有时你有一个私有(private)函数,你可以在私有(
问题是: 何时使用私有(private)函数,何时使用嵌套函数? (我在问 F# 但也许答案可能与其他功能语言相关) 一个小例子 namespace SomeName module BinaryRea
我发现工作表中仍然可以使用私有(private)函数。它们是隐藏的,但如果用户输入他们的名字,他们就会被调用。为什么?它应该以这种方式工作吗?有没有办法完全阻止用户定义的函数在 VBA 项目之外使用?
所以我最近开始尝试使用 Kotlin,我偶然发现了这个: If a top-level declaration is marked private, it is private to the pack
我是一名优秀的程序员,十分优秀!