2016-03-17 50 views
3

我想添加文件大小約束到我的表單,以禁止用戶上傳大於2M的文件(如在我的php.ini中設置),並且我嘗試了以下操作: 在formBuilder中:Symfony2文件大小約束形式

->add('avatar', 'file', array( 
      'label' => 'Insert foto', 
      'required' => false, 
      'constraints'=> array(
       new File(array('maxSize'=>'2048k', 
       'maxSizeMessage'=>'More than 2MB!!'))), 
      'label_attr' => array(
       'class' => 'control-label' 
      ), 
      'attr' => array(
       'class'   => 'form-control filestyle', 
       'placeholder'  => 'Foto'... etc, 

此外,我添加的文件屬性設置爲我的主要實體類

/** 
* @Assert\File(
*  maxSize = "2048k", 
*  mimeTypes = {"image/png"}, 
*  mimeTypesMessage = "Please upload a valid PNG file", 
*  maxSizeMessage = "Upload not more than 2M size files" 
*) 
*/ 
protected $avatar; 

在我的控制,我得到的文件與此:

$file = $form['avatar']->getData(); 

但仍然所有的操作都是在文件實際上傳到我的服務器後完成的。我不想上傳它,如果它大於2MB,而是我想顯示一條錯誤消息。也許我應該使用Formevents,但沒有找到工作示例。任何想法都會有所幫助。謝謝。

+0

使用Javascript或類似方法可以工作,但不是防彈解決方案,因爲可以輕鬆禁用或更改javascript。更好地驗證服務器端,如果你仍然想在JavaScript檢查了這一點http://stackoverflow.com/questions/8212041/it-is-possible-to-validate-the-size-and-type-of-input- file-in-html5 –

回答

3

如果您想在文件上傳前檢查文件大小,那麼您需要執行JavaScript approach

PHP(和Symfony)是服務器端,只能處理上傳後的文件。 JavaScript是客戶端,可以在上傳之前檢查文件。

我會忍受它正在上傳,並檢查它,因爲你在這一刻;這是最可靠的方法。

+0

謝謝,我會保留你的建議,但現在我會發現是否有更像'Symfony的方式'來做到這一點。另外,據我瞭解,JS客戶端驗證不受歡迎,例如爲了安全起見,我們需要在服務器端做出所有的評估。或者,也許我錯了.. – Jack

+0

最好讓Symfony做到這一點;就像你正在用'maxSize'和' - > add('avatar','file')'在你的formType中做的那樣。 [這篇文章](http://stackoverflow.com/questions/17951294/symfony2-file-upload-step-by-step)應該可以幫到你。 – Egg