我有一个以下问题,我有HTML表单,上传一个文件与一些额外的信息。但它允许上传仅少于10MB的文件。但是当用户尝试上传更大的内容时,$ _POST和$ _FILES数组都是空的(我预计$ _POST会有一些值,而$ _FILES会有一些值,但会表明存在上传错误。)
有一些问题(空的$ _POST,$ _FILES),但我找不到任何解决方案或解释。
HTML表单:
<form enctype="multipart/form-data" method="post" action="upload.php">
<p>
<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
<input type="file" name="image" />
</p>
<p>
<input type="text" name="other_field" />
</p>
</form>
upload.php的
print_r($_POST); // array()
print_r($_FILES); // array()
exit;
它工作正常,如果文件大小低于10MB(文件大小限制为10MB),我不想增加它,我只想捕获PHP中的错误。
从PHP网站
更新(解释/解决方案)来自PHP网站(我错过了这一部分): http://us.php.net/manual/en/ini.core.php#ini.post-max-size
设置允许的帖子数据的最大大小。此设置也会影响文件上载。要上传大文件,此值必须大于upload_max_filesize。如果配置脚本启用了内存限制,则memory_limit也会影响文件上载。一般来说,memory_limit应该大于post_max_size。使用整数时,该值以字节为单位。也可以使用本FAQ中描述的速记符号。如果发布数据的大小大于post_max_size,则$ _POST和$ _FILES超全局变量为空。这可以以各种方式跟踪,例如,通过将$ _GET变量传递给处理数据的脚本,即检查是否设置了$ _GET ['processed']。
答案 0 :(得分:34)
如编辑问题中所述,当PHP静默丢弃数据时,$ _POST和$ _FILES为空(当实际数据大于post_max_size时发生)。由于HTTP标头和$ _GET保持不变,因此可以使用它们来检测丢弃。
选项a)
if(intval($_SERVER['CONTENT_LENGTH'])>0 && count($_POST)===0){
throw new Exception('PHP discarded POST data because of request exceeding post_max_size.');
}
选项b)
添加一个GET参数,告诉POST数据是否存在。
答案 1 :(得分:14)
运行phpinfo()
并检查以确保您的upload_max_filesize
和post_max_size
指令足够大。
http://us.php.net/manual/en/ini.core.php#ini.upload-max-filesize
答案 2 :(得分:1)
我可以提一下,如果您处理下面的表格
if(isset($_POST['submit'])
如果post_max_size低于发布数据,则$ _POST ['submit']将为空
答案 3 :(得分:0)
在客户端和服务器端都存在一些限制。
在客户端,MAX_FILE_SIZE字段没有多大用处,也许浏览器可能会将其作为提示;但是浏览器遵循其配置的限制。
在服务器端,检查php.ini:
upload_max_filesize = 5M
post_max_size = 5M
max_input_time = ...
同时检查Apache的日志以获取有关丢弃POST主体等的注释。
答案 4 :(得分:-1)
您可以使用以下方法检查上传错误:
if ($_FILES['images']['error'] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES['images']['error']);
}
错误代码定义为here。