2013-05-02 75 views
10

我遇到令牌和文件字段形式的問題。Symfony2無效令牌與大文件

形式的驗證是這樣的:

public function getDefaultOptions(array $options) 
{ 
    $collectionConstraint = new Collection(array(
     'fields' => array(
      'file' => new File(
       array(
        'maxSize' => '2M', 
        'mimeTypes' => array(
         'application/pdf', 'application/x-pdf', 
         'image/png', 'image/jpg', 'image/jpeg', 'image/gif', 
        ), 
       ) 
      ), 
     ) 
    )); 

    return array(
     'validation_constraint' => $collectionConstraint 
} 

當我上傳無效大小的文件(〜5MB)我得到這個錯誤這是我的希望:

The file is too large. Allowed maximum size is 2M bytes 

但是,當我上傳了一個太大的文件(〜30MB)錯誤更改:

The CSRF token is invalid. Please try to resubmit the form 
The uploaded file was too large. Please try to upload a smaller file 

問題是錯誤標記。我用我的表單{{form_rest(form)}}代碼。我認爲錯誤的變化是因爲:How to increase the upload limit for files on a Symfony 2 form?

我不想增加上傳限制。我想令牌錯誤不顯示。

+0

你這個隨時隨地? – richsage 2013-06-06 09:03:08

+0

我沒有找到解決方案。我在getDefaultOptions中將csrf_portection設置爲false,但這是爲了避免錯誤消息。如果你找到一個解決方案,請ping我。 – Biruwon 2013-06-06 09:11:24

回答

7

PHP(不Symfony的)拒絕該文件,如果它是比你的配置價值更大:

post_max_size 
upload_max_filesize 

因爲這個CSRF,引發錯誤的。

如果你想避免這個,你必須增加上傳限制。這是唯一的方法。如果你添加文件約束,這應該沒有風險。

-2

在您的Entity.php您需要爲您的Assert file指定「maxSize」屬性。

例如,值「2147483648」等於2GB。

/** 
* @ORM\Column(type="string", length=255) 
*/ 
public $path; 

/** 
* @Assert\File(maxSize="2147483648") 
*/ 
public $file; 
0

問題

CSRF token invalid & upload file too large errors

這兩種錯誤是形式產生的錯誤,並且除了外地的錯誤,當任何異常形式內發生,他們就會出現。

在這種情況下上傳文件CSRF令牌無效的錯誤的出現是由於的post_max_size參數的php.ini配置文件和 上傳文件太大的錯誤出現由於的upload_max_filesize參數PHP .ini配置文件。

SOLUTION:

1可以增加配置文件中的值。

2-您可以在您的template.html.twig中進行字段驗證和評論,或省略form_errors行,請注意,此解決方案將刪除所有形式生成的錯誤通知。

template.html.twig的例子:

<div class="form"> 
{{ form_start(form) }} 

    {{ form_errors(form) }} --> before 
    {# {{ form_errors(form) }} #} --> after 

    <div class="field"> 
     {{ form_label(form.field) }} 
     {{ form_errors(form.field) }} 
     {{ form_widget(form.field) }} 
    </div> 

{{ form_end(form) }} 
</div>