3

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

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

从理论上讲,这真的很简单。在我的控制器中,当我收到文件输入时,我想让 SonataMedia 管理上传(即复制到正确位置等...),但我不知道应该如何做。

4

2 回答 2

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 已经为你提供了方便

于 2014-03-07T15:31:08.240 回答
1

Bundle 正是为了缩小 Symfony 和 SonataMedia 之间的差距。SonataMedia 是为原始 PHP 制作的,而 SonataMediaBundle 将 Symfony 接口附加到 SonataMedia;您正在重写 Bundle 的大部分功能。要获得如何正确完成的一个很好的例子,请查看 Bundle 的代码;)

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

于 2014-03-03T13:24:33.217 回答