将奏鸣曲媒体与奏鸣曲格式化程序ckeditor集成的图像限制文件大小

Posted

技术标签:

【中文标题】将奏鸣曲媒体与奏鸣曲格式化程序ckeditor集成的图像限制文件大小【英文标题】:Limit file size of image integrating sonata media with sonata formatter ckeditor 【发布时间】:2019-08-15 11:07:27 【问题描述】:

我尝试将奏鸣曲媒体与奏鸣曲格式化程序集成在一起,一切都很好,但我有两个问题。

    我可以限制文件大小吗? 为什么不运行 MIME 类型验证?

我跟踪了奏鸣曲格式化程序代码,并在 CkeditorAdminController::uploadAction (https://github.com/sonata-project/SonataFormatterBundle/blob/4.x/src/Controller/CkeditorAdminController.php#L93) 中看到控制器不检查表单是否有效,也不检查媒体是否有效。

另一方面,如果上传发生错误,ckeditor 只会显示服务器返回的错误页面,但不会再次显示输入文件小部件。

【问题讨论】:

【参考方案1】:

我终于设法让它扩展了默认和自定义 CkeditorAdminExtension 的控制器

namespace MediaBundle\Admin;

use Sonata\AdminBundle\Admin\AdminInterface;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\FormatterBundle\Admin\CkeditorAdminExtension;

/**
 * Adds browser and upload routes to the Admin.
 *
 * @author Kévin Dunglas <kevin@les-tilleuls.coop>
 */
// we override routing definitions
class CustomCkeditorAdminExtension extends CkeditorAdminExtension

    public function configureRoutes(AdminInterface $admin, RouteCollection $collection)
    
        $collection->add('ckeditor_browser', 'ckeditor_browser', [
            '_controller' => 'MediaBundle:CustomCkeditorAdmin:browser',
        ]);

        $collection->add('ckeditor_upload', 'ckeditor_upload', [
            '_controller' => 'MediaBundle:CustomCkeditorAdmin:upload',
        ]);
    

控制器:

namespace MediaBundle\Controller;


use Sonata\FormatterBundle\Controller\CkeditorAdminController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Response;

class CustomCkeditorAdminController extends CkeditorAdminController

    CONST MAX_IMAGE_FILE_SIZE = 200 * 1024; // 200 K
    CONST VALID_IMAGE_MIME_TYPES = ['image/pjpeg', 'image/jpeg', 'image/png', 'image/x-png'];

    public function uploadAction()
    
        $request = $this->get('request_stack')->getCurrentRequest();

        if($request->isMethod('POST'))
            $file = $file = $request->files->get('upload');

            if($file instanceof UploadedFile)
                if($file->getSize() > self::MAX_IMAGE_FILE_SIZE)
                    return new Response('Too big file');
                

                if(!in_array($file->getMimeType(), self::VALID_IMAGE_MIME_TYPES))
                    return new Response('File is not a valid image');
                
            
        

        return parent::uploadAction();
    

最后覆盖parameters.yml中的Extension参数

parameters:
    sonata.formatter.ckeditor.extension.class: "MediaBundle\\Admin\\CustomCkeditorAdminExtension"

【讨论】:

以上是关于将奏鸣曲媒体与奏鸣曲格式化程序ckeditor集成的图像限制文件大小的主要内容,如果未能解决你的问题,请参考以下文章

Sonata Bundle 之间的依赖关系

将奏鸣曲媒体路径保存到树枝变量中

奏鸣曲媒体包修改 MediaType

如何在 symfony 中覆盖奏鸣曲媒体包的默认上传路径?

奏鸣曲媒体包中的错误

集成 Sonata Media Bundle(媒体实体)和 Sonata Classiffication Bundle(标签实体)