Symfony multiple Files总最大大小约束

时间:2017-07-21 12:11:24

标签: php symfony symfony-forms multifile-uploader

任务

情况非常典型:我希望允许用户以一种形式上传多个文件,但所有文件的总大小不应超过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类。

<?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类定义的。注释,但显然可以重写为包含在Form类buildForm()方法中。

问题

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

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

1 个答案:

答案 0 :(得分:2)

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