SonataMediaBundle - 如何使用自定义文件输入

时间:2014-02-27 22:28:12

标签: php angularjs symfony sonata-admin sonata-media-bundle

我有一种清道夫追捕项目,我在其中使用AngularJS来管理它可能包含的不同问题。这些问题属于不同类型。因此,有些可能包含文件输入,有些可能不包括。在这个项目中,我也使用Symfony和SonataMediaBundle来管理我的文件和图像。

由于我的html模型(主要是我的表单)可能会根据用户的操作而改变,因此我无法使用Symfony的内置工具来生成表单。因此,我的所有表格都是定制的。当我想要上传一些文件时,这给了SonataMediaBundle一个问题。如果用户选择文件,则在发送表单时,此文件将通过POST发送到控制器中的方法。因此,我想将这个收到的文件发送到SonataMediaBundle,以便它可以管理它,但我没有在文档中的任何地方找到如何做这样的事情。

理论上讲,它非常简单。在我的控制器中,当我收到文件输入时,我想让SonataMedia管理上传(即复制到正确的位置等等),我不知道该怎么做。

2 个答案:

答案 0 :(得分:8)

使用symfony2并没有利用它的好处你犯了一个很大的错误,你应该正确地构建你的应用程序,但就你的问题而言,没有任何内容受到symfony的限制,但是你自己如何使用它。你可以得到奏鸣曲来自容器的媒体管理器服务,您必须手动设置媒体管理器所需的所有设置器,您必须手动处理文件大小,文件mimetype等验证。下面是演示如何将文件存储在奏鸣曲媒体包

/* Before class use these*/
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Application\Sonata\MediaBundle\Entity\Media;

public function uploadAction()
{

$file = $this->get('request')->files->get('filefieldname');

    if (!$file instanceof UploadedFile || !$file->isValid()) {
        return new Response(json_encode(array(
            'event' => 'uploader:error',
            'data'  => array(
                'message' => 'Missing file.',
            ),
        )));
    }

/* validate max min size for the file */
/* validate mime type for the file */
/* Get sonata media manager service from container    */ 
$mediaManager = $this->container->get('sonata.media.manager.media');
/* create new instance of sonata media class in my case entity is located at 
* Application\Sonata\MediaBundle\Entity\Media 
*/
$media = new Media();
$media->setBinaryContent($file);
$media->setContext('default'); 
$ImagemimeTypes = array('image/jpeg', 'image/png');
$FilemimeTypes = array('application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    'application/msword', 'application/pdf', 'application/x-pdf');
if (in_array($file->getMimeType(), $FilemimeTypes)) {
    $media->setProviderName('sonata.media.provider.file');
}
if (in_array($file->getMimeType(), $ImagemimeTypes)) {
    $media->setProviderName('sonata.media.provider.image');
}
 /*If you have other providers in your app like vimeo /dailymotion etc
 then do set here i have shown you the demo for adding image/file in sonata media */
/*other setters if you want to set like enabled/disable etc*/
 $mediaManager->save($media);
// end function
}

但是再一次,你需要做很多工作,symfony已经为你提供了便利

答案 1 :(得分:1)

The Bundle正是为了弥合Symfony和SonataMedia之间的这种差距。 SonataMedia是为原始PHP而制作的,而SonataMediaBundle则将Symfony接口连接到SonataMedia;你正在重写Bundle功能的大部分内容。要获得正确完成的良好示例,请查看Bundle的代码;)

很抱歉,如果您认为下一个建议是彻底的,我根据问题中的有限信息无法确定。 Symfony表单非常灵活,提供了许多关键功能,您不应该尝试自己重新实现(如CSRF-tokens)。大多数问题与表单系统有很好的解决方案。如果表单是变形的(具有许多字段的星座,基于UI交互)并且不能由多种表单类型处理,那么您仍然可以选择。如果您可以设置一个GET参数来指示当前正在发送哪种类型的表单,那么您可以将其传递给FormBuilder。您甚至可以选择为整个应用程序构建一个大表单,其中包含您使用过的每个字段 - 这有点浪费,但仍然比尝试将发布+奏鸣曲连接在一起更好。第一个版本最痛苦的是一些额外的字节和空字段。你尝试的伤害最小的是引入严重的安全漏洞。