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

Dmi*_*y F 40 html php

我有一个以下问题,我有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>
Run Code Online (Sandbox Code Playgroud)

upload.php的

print_r($_POST);  // array()
print_r($_FILES); // array()
exit;
Run Code Online (Sandbox Code Playgroud)

它工作正常,如果文件大小低于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'].

Aug*_*ing 36

如编辑问题中所述,当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.');
}
Run Code Online (Sandbox Code Playgroud)

选项b)
添加一个GET参数,告诉POST数据是否存在.

  • 注意:$_SERVER['CONTENT_LENGTH'] 不是“永远”设置的,服务器主机可以禁止这个变量可见 (2认同)

Cro*_*tab 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

  • 意图不是抱怨 - 虽然我看到它是如何遇到的.你的答案被投票高于奥古斯都的答案,这比你的答案要远得多,实际上解释了问题是什么,甚至提供了一个解决方案来检测`$ _POST`何时是空的,因为它超过了最大值.我赞成他的并投票给你,所以他的回答是第一位的,因为它更有用.该评论只是作为downvote的解释.我支持downvote:关键信息是*为什么*`$ _POST`将是空的. (3认同)
  • 这并没有解决为什么`$_POST` 为空的问题。如果文件大小有错误,您会看到错误消息,而不是空的“$_POST”。 (2认同)