PHP - 清空$ _POST和$ _FILES - 上传较大的文件时

时间:2011-10-21 17:16:26

标签: php html

我有一个以下问题,我有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']。

5 个答案:

答案 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_filesizepost_max_size指令足够大。

http://us.php.net/manual/en/ini.core.php#ini.upload-max-filesize

http://us.php.net/manual/en/ini.core.php#ini.post-max-size

答案 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