当文件大于 post_max_size 时 Symfony2 验证器不工作

Posted

技术标签:

【中文标题】当文件大于 post_max_size 时 Symfony2 验证器不工作【英文标题】:Symfony2 validator not working when file is bigger than post_max_size 【发布时间】:2012-06-15 09:39:02 【问题描述】:

我已在 php.ini 中将 upload_max_filesizepost_max_size 设置为 32Mb。

我正在使用 Symfony2。我创建了一个包含文件变量的实体,以便人们可以上传文件:

/**
 * @Assert\File(maxSize="3M")
 */
public $file;
当文件小于 3Mb 时,文件被正确上传。 当 3Mb 验证器工作正常时,显示正常错误消息“文件太大” 但是,当文件 > 32Mb (post_max_size) 时:

致命错误:允许的内存大小为 150994944 字节已用尽(已尝试 分配 62353390 字节)在 /Applications/MAMP/htdocs/Symfony/vendor/symfony/src/Symfony/Component/HttpKernel/Profiler/Profiler.php 在第 177 行

当上传的文件大于 post_max_size 时,有没有办法让验证器工作? Symfony 如何处理大于 post_max_size 的文件上传?

【问题讨论】:

【参考方案1】:

这是关于 PHP 的问题,而不是 Symfony。由于您限制 POST 参数大小,您的提交请求甚至不会“到达”控制器。

由于 post_max_size 限制所有 POST 参数,包括文件,您应该将 post_max_size 定义为高于 upload_max_filesize

所以现在,您的问题似乎与此有关:How to gracefully handle files that exceed PHP's `post_max_size`?

【讨论】:

非常感谢佩斯。我认为问题几乎解决了。我现在可以使用 $_SERVER['CONTENT_LENGTH'] 检查上传的文件是否大于 post_max_size。 var_dump(POST) 和 var_dump(FILES) 都返回 array(0)。但是,最后,当我想抛出异常时,我仍然得到分配内存错误。我只是不明白为什么 Apache 试图在内存中分配一个文件,即使它太大(>post_max_size)。我该怎么办?增加内存没有意义...... 嗨Pece,我还不能接受答案,因为问题还没有解决:-|我试图找出为什么即使 $_POST 和 $_FILES 是空的,允许的内存大小也会耗尽......如果你有任何想法,那就太棒了。您有调试此类错误的技巧吗?干杯! 有一个名为“memory_limit”的 PHP 参数定义了脚本可以消耗的最大内存量。也许问题不在于文件上传,而在于您对上传旁边的文件所做的操作...在处理的许多步骤中使用 memory_get_usage() 以了解您在哪里使用了大量内存。 谢谢!我试过这个,这很有趣。 memory_get_usage() 总是很低。然而,symfony 尝试分配给内存的大小是我上传的文件的大小……而且 $_POST 和 $_FILES 又是空的。我最终想知道 symfony 本身,所以我在 symfony 之外和 symfony 内尝试了一个简单的代码......它只在 symfony 之外工作。我已接受您的回答,并将在代码中发布一个新问题。现在我很确定它与 Symfony 相关。 Symfony 可能会在后台对文件做一些事情。非常感谢您的帮助。 :-) 如果您有兴趣,这里是post :-)

以上是关于当文件大于 post_max_size 时 Symfony2 验证器不工作的主要内容,如果未能解决你的问题,请参考以下文章

百度编辑器上传文件的bug

使sym链接到可执行文件

如何编辑PHP.ini文件以启用更大的文件上传? [重复]

如何优雅地处理超过 PHP `post_max_size` 的文件?

PHP post_max_size 覆盖upload_max_filesize

nginx 413 请求实体在上传时太大[加载超过 1Mb 的文件