情况非常典型:我希望允许用户以一种形式上传多个文件,但所有文件的总大小不应超过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提供的现有约束的某种组合?是否应该编写自己的字段验证回调?
答案 0 :(得分:2)
在这种情况下,您可以创建自己的验证器并将其应用于整个班级。