【问题标题】:Symfony2 invalid token with big filesSymfony2 带有大文件的无效令牌
【发布时间】:2013-05-02 11:40:14
【问题描述】:

我在使用令牌和文件字段表单时遇到问题。

表单的验证是这样的:

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?

我不想增加上传限制。我希望不显示令牌错误。

【问题讨论】:

  • 你有什么收获吗?
  • 我没有找到解决方案。我在 getDefaultOptions 中将 csrf_portection 设置为 false,但这是为了避免错误消息。如果您找到解决方案,请联系我。

标签: symfony symfony-forms


【解决方案1】:

如果文件大于您在以下位置配置的值,PHP(不是 Symfony)会拒绝该文件:

post_max_size
upload_max_filesize

因此引发 csrf-error。

如果您想避免这种情况,您必须增加上传限制。这是唯一的方法。如果您添加文件约束,这应该没有风险。

【讨论】:

    【解决方案2】:

    问题

    CSRF token invalid & upload file too large errors

    这两个错误是表单生成的错误,除了字段错误外,当表单内部发生异常时都会出现。

    在这种上传文件的情况下,由于php.ini配置文件中的post_max_size参数会出现CSRF token invalid error,并且 由于php.ini配置文件中的upload_max_filesize参数,出现upload file too large error

    解决方案:

    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>
    

    【讨论】:

      【解决方案3】:

      在您的 Entity.php 中,您需要将“maxSize”属性指定给您的Assert file

      例如,值“2147483648”等于 2GB。

      /**
      * @ORM\Column(type="string", length=255)
      */
      public $path;
      
      /**
       * @Assert\File(maxSize="2147483648")
       */
      public $file;
      

      【讨论】:

        猜你喜欢
        • 2015-10-25
        • 2012-12-15
        • 1970-01-01
        • 2015-08-04
        • 1970-01-01
        • 2019-12-24
        • 2011-11-27
        • 2013-11-09
        • 2017-09-30
        相关资源
        最近更新 更多