可能重复:
How to detect if a user uploaded a file larger than post_max_size?
我正在编写一个处理来自Web应用程序的文件上传的脚本。我对可以上传到我的应用程序的文件大小有一个限制(存储空间限制)。我正在尝试放入一些验证代码,以确保用户实际上传了一个文件,以便我可以向他们显示一个很好的错误消息。但是,如果用户上传的文件太大,我也希望能够向用户显示错误消息。我可以使用Javascript,但我也想要一个PHP检查,以防他们没有启用Javascript。
我已将PHP.ini中的POST_MAX_SIZE var设置为最大文件上载大小,但这会产生意外问题。如果有人尝试上传大于POST_MAX_SIZE的文件,则二进制数据将以最大大小截断,而$ _FILES数组不包含该文件的条目。这与用户根本没有提交文件时会发生的行为相同。
这使得很难说出为什么$ _FILES数组不包含文件,即它是否曾经上传过,或者它是否太大而无法完全发送。
有没有办法区分这两种情况?换句话说,有没有办法判断是否为文件发送了POST数据,但在整个文件发送之前是否过早地被截断了?
答案 0 :(得分:5)
这样的事情:
if ($_SERVER['CONTENT_LENGTH'] && !$_FILES && !$_POST) {
// upload failed
}
未经测试,因此请使用各种方案来查看哪种组合有效。不确定它是否适用于多个文件同时上传。
您可能需要检查$_SERVER['CONTENT_LENGTH']
并将其与处理多个上传时收到的文件总数进行比较。
答案 1 :(得分:4)
看似奇怪,this is intentional behavior,因为POST_MAX_SIZE是一个低级别的终极故障保护,并且为了保护你并防止DOS攻击,服务器除了丢弃所有POST数据外无法做任何事情当它意识到中流时,它接收到的数据超过它可以安全处理的数据。如果您知道需要一次接收的数据超过此数量,则可以提高此值(但请确保您的服务器可以处理增加的负载),但我建议您考虑使用其他方式处理您的使用例如,遇到POST_MAX_SIZE可能会告诉我,可能存在比一个大型HTTP POST更强大的解决方案,例如将其拆分为多个AJAX调用。
与POST_MAX_SIZE分开有UPLOAD_MAX_SIZE,这是单个文件限制的php.ini设置,这是我假设你最初谈论的内容。它限制了任何一个上传文件的大小,如果文件超过此值,它会将$_FILES['file']['error']
设置为1
。一般来说,您希望将您的网站设置为:
<form>
MAX_FILE_SIZE应设置为您希望为此表单接受的最大值。虽然任何试图利用您网站的用户都可以解决这个问题,但对于实际使用您网站的用户来说这很好,因为浏览器会(actually, could)阻止他们浪费试图上传它的带宽。这应始终小于服务器端设置。$_FILES
数组。这应该比您希望在整个网站中实际接受的最大文件更大。关于如何判断的具体问题,关于POST_MAX_SIZE的PHP文档我链接到建议设置形式的get变量,即
<form action="edit.php?processed=1">
但正如我上面所述,如果您遇到此问题,可能需要探索其他上传方法。