2017-07-21 62 views
2

任務

的情況是比較典型的:我想允許用戶上傳多個文件的一種形式,但所有文件的總大小不應超過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提供的現有約束是否有一些組合?是否應該訴諸寫自己的字段驗證回調?

+2

我不認爲有什麼辦法可以用標準的Symfony來實現這一點,你將不得不創建你自己的驗證器 –

+0

自定義約束/驗證器將完成這項工作。 –

回答

1

在這種情況下,您可以創建自己的驗證器並將其應用於整個班級。

+0

你有樣品代碼嗎? Callback約束文檔對我來說不是很清楚。 –

+0

當您創建自己的約束時,覆蓋getTarget方法: public function getTargets() { return self :: CLASS_CONSTRAINT; } 要創建自定義禁忌/驗證,請點擊此鏈接:https://symfony.com/doc/current/validation/custom_constraint.html –