任務
的情況是比較典型的:我想允許用戶上傳多個文件的一種形式,但所有文件的總大小不應超過50 MB。Symfony的多個文件總最大尺寸約束
代碼
<?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';
}
}
和對應的表單數據類。
<?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提供的現有約束是否有一些組合?是否應該訴諸寫自己的字段驗證回調?
我不認爲有什麼辦法可以用標準的Symfony來實現這一點,你將不得不創建你自己的驗證器 –
自定義約束/驗證器將完成這項工作。 –