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

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

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

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

理论上来说,其实很简单。在我的 Controller 中,当我收到文件输入时,我想让 SonataMedia 管理上传(即复制到正确位置等...),但我不知道应该怎么做。

最佳答案

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

/* 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 已经为你提供了轻松的返工

关于php - SonataMediaBundle - 如何使用自定义文件输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22081957/

相关文章:

php - 没有模型 [App\Products] Laravel 的查询结果

php、MySql查询,两个COUNT一个GROUP BY

javascript - AngularJS ng-repeat 在重写 HTML 的指令中不起作用

javascript - 如何存储 POST 请求的结果以在 Ionic 和 Angular 中的另一个 Controller 中使用

symfony - symfony 服务器和 bin/console 服务器之间的区别?

php - 将用户名(mysql表中的字段)与PHP中的 session ID匹配

php - PHP 中的 $str == '' 和 strlen($str) == 0 有区别吗?

javascript - 如何使用 excel-builder.js 导出 Excel 文件

symfony - 在生产中使用 symfony/dotenv 包

php - Symfony/Doctrine 重新排列数据库列