Symfony 多个文件总最大大小限制

Symfony multiple Files total max size constraint

任务

情况很典型:我想允许用户以一种形式上传多个文件,但所有文件的总大小不能超过 50 MB。

代码

<?php

namespace Acme\SiteBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\FormBuilderInterface;

class UploadFilesType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('attachedFiles', FileType::class, [
                'multiple' => true,
                'attr' => [
                    'accept' => '*/*',
                    'multiple' => 'multiple',
                ],
            ])
            ->setMethod('POST');
    }

    public function getBlockPrefix()
    {
        return 'uploadFilesForm';
    }
}

以及对应的Form Data class.

<?php

namespace Acme\SiteBundle\Form;

use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;

class UploadFilesDataType
{

    /**
     * @Assert\All({
     *      @Assert\File(maxSize="50M", maxSizeMessage="File size limit exceeds 50 MB")
     * })
     */
    private $attachedFiles;

    /**
     * @return UploadedFile[]
     */
    public function getAttachedFiles()
    {
        return $this->attachedFiles;
    }

    /**
     * @param UploadedFile[] $attachedFiles
     */
    public function setAttachedFiles($attachedFiles)
    {
        $this->attachedFiles = $attachedFiles;
    }

    /**
     * @param UploadedFile $attachedFile
     */
    public function addAttachedFile($attachedFile)
    {
        $this->attachedFiles[] = $attachedFile;
    }
}

约束是通过 FormData class' 注释定义的,但显然可以重写以包含在 Form class buildForm() 方法中。

问题

包含maxSizefacet的File约束可以直接应用于单个上传文件字段,但是当涉及到多个上传文件时,则必须使用All 约束。 但是,使用 All 约束只能为文件集合中的每个元素定义约束(例如,单个上传文件的大小)。

如何验证文件总大小? Symfony 是否提供了现有约束的某种组合?是否应该诉诸于编写自己的字段验证回调?

在这种情况下,您可以创建自己的验证器并将其应用于整个 class。