Мне нужно добавить .SVG расширение файла для моей конфигурации.
На данный момент в моем проекте у меня есть другие расширения как (PDF, изображения)
Я сделал следующие изменения
Теперь я могу загрузить файл SVG, но проблема в том, что пользователь может загрузить другие расширения файлов например, PDF и т. д.
Как можно этого избежать? Или найти правильный способ проверки формы?
Документация сонаты:
помог мне, но не для проверки формы.
Что мне не хватает?
Я изменил следующие файлы:
#app/config/sonata_config.yml
sonata_media:
default_context: images_file
db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr
contexts:
pdf_file:
providers:
- sonata.media.provider.file
formats: ~
images_file:
providers:
- sonata.media.provider.image
formats:
1x: { width: 870 , height: 412 , quality: 80 }
2x: { width: 1740 , height: 824 , quality: 50 }
svg_file:
providers:
- sonata.media.provider.file
formats: ~
cdn:
server:
path: /uploads/media # http://media.sonata-project.org/
filesystem:
local:
directory: %kernel.root_dir%/../web/uploads/media
create: false
providers:
file:
service: sonata.media.provider.file
resizer: false
filesystem: sonata.media.filesystem.local
cdn: sonata.media.cdn.server
generator: sonata.media.generator.default
thumbnail: sonata.media.thumbnail.format
allowed_extensions: ['pdf', 'txt', 'rtf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pttx', 'odt', 'odg', 'odp', 'ods', 'odc', 'odf', 'odb', 'csv', 'xml','svg']
allowed_mime_types: ['application/pdf', 'application/x-pdf', 'application/rtf', 'text/html', 'text/rtf', 'text/plain', 'image/svg+xml']
Файл формы:
use Sonata\AdminBundle\Admin\Admin;
class CustomAdmin extends Admin
{
/**
* @param FormMapper $formMapper
*/
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add(
'NormalLogo',
'sonata_type_model_list',
array('required' => false),
array(
'link_parameters' => array('context' => 'images_file', 'provider' => 'sonata.media.provider.image'),
)
)
->add(
'SvgLogo',
'sonata_type_model_list',
array('required' => false),
array(
'link_parameters' => array('context' => 'svg_file', 'provider' => 'sonata.media.provider.file'),
)
)
->add('overriddenBy', 'sonata_type_model',
array(
'empty_value' => 'Not overridden',
'btn_add' => false,
'btn_list' => false,
'btn_delete' => false,
'btn_catalogue' => false,
)
);
}
}
Вы можете создать свой собственный провайдер для файлов SVG только для этого, вам нужно сначала определить сервис для вашего провайдера SVG
parameters:
application_sonata_media.svg_class: Application\Sonata\MediaBundle\Provider\SVGProvider
services:
sonata.media.provider.svg:
class: %application_sonata_media.svg_class%
tags:
- { name: sonata.media.provider }
arguments:
- sonata.media.provider.svg
- @sonata.media.filesystem.local
- @sonata.media.cdn.server
- @sonata.media.generator.default
- @sonata.media.thumbnail.format
- allowed_extensions: ['svg']
- allowed_mime_types: ['image/svg+xml']
Используя сонату, вы можете создавать расширенные пакеты, используя EASYEXTENDS BUNDLE
по умолчанию он генерирует расширенный пакет в src/Application/Sonata/MediaBundle
но вы можете указать и другое место назначения. Теперь создайте вышеуказанный сервис в расширенном мультимедийном пакете. services.yml
и импорт в основном config.yml
Если вы хотите добавить больше MIME-типов или расширений, которые вы можете определить в приведенном выше сервисе allowed_mime_types: ['image/svg+xml','application/pdf']
imports:
- { resource: @ApplicationSonataMediaBundle/Resources/config/services.yml }
Теперь создайте свой класс провайдера в расширенном медиа-пакете как SVGProvider
и расширить класс вашего провайдера с помощью сонаты медиа FileProvider
<?php
namespace Application\Sonata\MediaBundle\Provider;
use Sonata\MediaBundle\Provider\FileProvider as BaseFileProvider;
use Gaufrette\Filesystem;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Validator\ErrorElement;
use Sonata\MediaBundle\CDN\CDNInterface;
use Sonata\MediaBundle\Generator\GeneratorInterface;
use Sonata\MediaBundle\Metadata\MetadataBuilderInterface;
use Sonata\MediaBundle\Model\MediaInterface;
use Sonata\MediaBundle\Thumbnail\ThumbnailInterface;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\NotNull;
class SVGProvider extends BaseFileProvider {
protected $allowedMimeTypes;
protected $allowedExtensions;
protected $metadata;
public function __construct( $name, Filesystem $filesystem, CDNInterface $cdn, GeneratorInterface $pathGenerator, ThumbnailInterface $thumbnail, array $allowedExtensions = array(), array $allowedMimeTypes = array(), MetadataBuilderInterface $metadata = null ) {
parent::__construct( $name, $filesystem, $cdn, $pathGenerator, $thumbnail );
$this->allowedExtensions = $allowedExtensions;
$this->allowedMimeTypes = $allowedMimeTypes;
$this->metadata = $metadata;
}
public function buildCreateForm( FormMapper $formMapper ) {
$formMapper->add( 'binaryContent', 'file', array(
'label' => 'Upload SVG file only',
'constraints' => array(
new NotBlank(),
new NotNull(),
),
) );
}
/**
* {@inheritdoc}
*/
public function validate( ErrorElement $errorElement, MediaInterface $media ) {
if ( ! $media->getBinaryContent() instanceof \SplFileInfo ) {
return;
}
if ( $media->getBinaryContent() instanceof UploadedFile ) {
$fileName = $media->getBinaryContent()->getClientOriginalName();
} elseif ( $media->getBinaryContent() instanceof File ) {
$fileName = $media->getBinaryContent()->getFilename();
} else {
throw new \RuntimeException( sprintf( 'Invalid binary content type: %s', get_class( $media->getBinaryContent() ) ) );
}
if ( ! in_array( strtolower( pathinfo( $fileName, PATHINFO_EXTENSION ) ), $this->allowedExtensions ) ) {
$errorElement
->with( 'binaryContent' )
->addViolation( 'Invalid extensions' )
->end();
}
if ( ! in_array( $media->getBinaryContent()->getMimeType(), $this->allowedMimeTypes ) ) {
$errorElement
->with( 'binaryContent' )
->addViolation( 'Invalid mime type : ' . $media->getBinaryContent()->getMimeType() )
->end();
}
}
}
Здесь вы можете переопределить функции базового класса и определить свои собственные функции, как вы хотите, например, вы хотите добавить некоторые проверки для ввода файлов, которые вы можете настроить validate()
функция для изменения атрибутов для поля ввода файла, вы можете определить его в buildCreateForm()
метод
Теперь в вашем администраторе, если вы хотите разрешить загрузку только SVG, вы можете определить свой собственный провайдер, который разрешает только файлы SVG
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add(
'SvgLogo',
'sonata_type_model_list',
array('required' => false),
array(
'link_parameters' => array('context' => 'svg_file', 'provider' => 'sonata.media.provider.svg'),
)
)
}
Других решений пока нет …