PHP - 限制文件大小但不知何故得到警告:POST Content-Length超出限制

时间:2017-03-30 08:19:33

标签: php html

我想测试一下文件上传代码。这是一个上传文件代码,它可以选择用户是否有要上传的文件,或者只是空白地提交。我添加了错误消息以限制文件扩展名。它有效。

然后,我添加了一条错误消息,通知用户有关限制文件的大小。但不知何故得到了Warning: POST Content-Length of 681075903 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

而不是错误消息"抱歉,您的文件太大了。只有3MB允许"从PHP代码。

<html><head></head>
<body>

<form method="post" action="" enctype="multipart/form-data">

    Upload File:
    <input type="file" name="upload" /><br> 
    <input type="submit" name="submit" value="Submit"/>
</form>
</body>
</html>

<?php
include("config.php");
if(isset($_POST['submit'])  ){

//user has the option whether to upload the file or not
if ($_FILES['upload']['size'] != 0 ){

$filename = $con->real_escape_string($_FILES['upload']['name']);
$filedata= $con->real_escape_string(file_get_contents($_FILES['upload']['tmp_name']));
$filetype = $con->real_escape_string($_FILES['upload']['type']);
$filesize = intval($_FILES['upload']['size']);

$allowed =  array('zip','rar', 'pdf', 'doc', 'docx');
$ext = pathinfo($filename, PATHINFO_EXTENSION);

if(in_array($ext, $allowed)){           

            if($filesize > 3000000) {
                $query = "INSERT INTO contracts(`filename`,`filedata`, `filetype`,`filesize`) VALUES ('$filename','$filedata','$filetype','$filesize')" ;

                if ($con->query($query) == TRUE) {
                echo "<br><br> New record created successfully";
                } else {
                echo "Error:<br>" . $con->error;
                }

                }
            else{
                echo "Sorry, your file is too large. Only 3MB allowed";
            }
        }
        else{
            echo "Sorry, only zip, rar, pdf, doc & docs files are allowed.";        
        }

//if user has no file to upload then proceed to this else statement
} else {

$filename = $con->real_escape_string($_FILES['upload']['name']);
$filetype = $con->real_escape_string($_FILES['upload']['type']);
$filesize = intval($_FILES['upload']['size']);

$query = "INSERT INTO contracts(`filename`, `filetype`,`filesize`) VALUES ('$filename','$filetype','$filesize')" ;

if ($con->query($query) == TRUE) {
echo "<br><br> New record created successfully";
} else {
echo "Error:<br>" . $con->error;
}

}
$con->close(); 
}   

?>

我不明白。我在这段代码中做错了什么?

我认为是问题的if ($_FILES['upload']['size'] != 0 ){部分,但我仍然希望我的用户可以选择上传。

2 个答案:

答案 0 :(得分:2)

您的代码不是问题。由于post max size设置,http请求不会通过php。

在服务器的php.ini中找到这一行并进行更改:

; http://php.net/post-max-size
post_max_size = [max uploadsize like '32M' or '1G']

答案 1 :(得分:0)

您可以发布表单HTML代码吗?

问题是,php有一个指令(post_max_size),它限制了他在POST中允许的大小 - 在执行脚本之前。因此,如果达到此限制,则会在调用脚本之前发出警告,并且未填写$ _POST。

它值得进行额外的测试,但请确保:

此外,尝试在输入上设置maxlength属性也很有用,因为这在RFC-1867中有说明。

  

如果INPUT标记包含属性MAXLENGTH,则用户代理应考虑其值以表示服务器将为传输文件接受的最大Content-Length。

     

通过这种方式,服务器可以在上传之前向客户端提示他们可用于文件上载的空间。但是,需要注意的是,这只是一个提示,服务器的实际要求可能会在表单创建和文件提交之间发生变化。

这样就可以直接在符合RFC的浏览器中禁止上传。