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()
方法中。
问题
包含maxSize
facet的File
约束可以直接应用于单个上传文件字段,但是当涉及到多个上传文件时,则必须使用All
约束。
但是,使用 All
约束只能为文件集合中的每个元素定义约束(例如,单个上传文件的大小)。
如何验证文件总大小? Symfony 是否提供了现有约束的某种组合?是否应该诉诸于编写自己的字段验证回调?
在这种情况下,您可以创建自己的验证器并将其应用于整个 class。
任务
情况很典型:我想允许用户以一种形式上传多个文件,但所有文件的总大小不能超过 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()
方法中。
问题
包含maxSize
facet的File
约束可以直接应用于单个上传文件字段,但是当涉及到多个上传文件时,则必须使用All
约束。
但是,使用 All
约束只能为文件集合中的每个元素定义约束(例如,单个上传文件的大小)。
如何验证文件总大小? Symfony 是否提供了现有约束的某种组合?是否应该诉诸于编写自己的字段验证回调?
在这种情况下,您可以创建自己的验证器并将其应用于整个 class。