上传大于POST_MAX_SIZE时,PHP $ _POST / $ _FILES为空

时间:2012-07-13 18:21:53

标签: file-upload php

  

可能重复:
  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数据,但在整个文件发送之前是否过早地被截断了?

2 个答案:

答案 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)阻止他们浪费试图上传它的带宽。这应始终小于服务器端设置。
  • UPLOAD_MAX_FILESIZE是服务器将接受的最大大小,丢弃更大的内容并将错误报告给$_FILES数组。这应该比您希望在整个网站中实际接受的最大文件更大
  • POST_MAX_SIZE是服务器在单个POST请求中愿意接受的最大数据量。这必须大于UPLOAD_MAX_SIZE才能使大型上传成功,并且必须大得多才能一次上传多个文件。我可能会建议UPLOAD_MAX_FILESIZE * 4.1的值 - 这将允许一次四个大文件,以及一些额外的数据。 YMMV当然,你应该确保你的服务器可以正确处理你决定设置的任何值。

关于如何判断的具体问题,关于POST_MAX_SIZE的PHP文档我链接到建议设置形式的get变量,即

<form action="edit.php?processed=1">

但正如我上面所述,如果您遇到此问题,可能需要探索其他上传方法。