Правило File
Правило File применяется к полям формы,
которые принимают загружаемые файлы. Оно проверяет,
что файл не превышает максимальный размер, имеет
разрешённый MIME-тип и допустимое расширение.
Правило вешается на поле через опцию constraints
или через атрибут #[File] на свойстве сущности.
Параметр maxSize задаёт максимальный размер файла,
а mimeTypes - список разрешённых MIME-типов.
Синтаксис
#[File(
maxSize: '2M',
mimeTypes: ['image/jpeg', 'image/png'],
extensions: ['jpg', 'png'],
)]
Пример
Давайте создадим форму с полем для загрузки изображения
и повесим на него правило File с ограничением
по размеру и MIME-типу:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeFileType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentValidatorConstraintsFile;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('image', FileType::class, [
'constraints' => [
new File([
'maxSize' => '2M',
'mimeTypes' => ['image/jpeg', 'image/png'],
'extensions' => ['jpg', 'png'],
]),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Пример
Давайте обработаем форму в контроллере и проверим, валиден ли загруженный файл:
<?php
namespace AppController;
use AppFormArticleType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/upload', name: 'article_upload')]
public function upload(Request $request): Response
{
$form = $this->createForm(ArticleType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$file = $form->get('image')->getData();
return new Response('file: ' . $file->getClientOriginalName());
}
return $this->render('article/upload.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода для файла 'image.jpg':
"file: image.jpg"
Пример
Давайте повесим правило File через атрибут
на свойство сущности:
<?php
namespace AppEntity;
use SymfonyComponentValidatorConstraintsFile;
class Article
{
#[File(
maxSize: '5M',
mimeTypes: ['application/pdf'],
extensions: ['pdf'],
)]
private ?string $document = null;
public function getDocument(): ?string
{
return $this->document;
}
public function setDocument(?string $document): void
{
$this->document = $document;
}
}
?>
Если загрузить файл 'doc.txt' вместо PDF,
форма вернёт ошибку валидации:
"The mime type of the file is invalid (\"text/plain\"). Allowed mime types are \"application/pdf\"."