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

标签 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() 方法中。

问题

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

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

最佳答案

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

关于php - Symfony 多个文件总最大大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237363/

相关文章:

php - 使用 jQuery 或 javascript 聚焦 'multiple' HTML 输入字段

php - Laravel 测试路由授权,中间件授权问题

php - 必须配置路径 "secret"的子节点 "security.firewalls.main.remember_me"

php - symfony2 中的多个防火墙

mysql - 数小时内使用 DATE_SUB 的 Symfony2 sql 查询

PHP/Google OAuth - 获取 MAIN gmail 电子邮件而不是@pages.plusgoogle 电子邮件

php - 如何使用 kohana 3.2 使用 PHPExcel 创建新工作表

forms - 如何对 Symfony2 表单集合项进行排序

php - Symfony 表单验证在编辑中不起作用

forms - 如何使用 Symfony2 表单清除字段值