【问题标题】:PHP - limit the file size but somehow got Warning: POST Content-Length exceeds the limitPHP - 限制文件大小但以某种方式得到警告:POST Content-Length 超出限制
【发布时间】:2017-08-24 01:05:20
【问题描述】:

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

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

而不是来自 php 代码的“抱歉,您的文件太大。只允许 3MB”的错误消息。

<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 ){ 部分引起了问题,但我仍然希望我的用户可以选择上传。

【问题讨论】:

  • 您可以创建一个 php.ini,最大音量为我认为 php 配置不允许您发送更多数据。 php.ini `upload_max_filesize = '你的尺寸' post_max_size = '你的尺寸'`
  • 确保 PHP 设置 post_max_size 至少与您的最大上传大小相同。
  • 顺便说一句,if($filesize &gt; 3000000) { 可能应该是 &lt; 3000000 - 目前您只允许大于 ~3MB 的文件,并在它们低于时输出“太大”错误那个尺寸。
  • @CD001 不。仍然是它给我的警告。
  • 嗯,是的,您正在尝试根据下面答案中的 cmets 上传一个 681MB 的文件。我只是指出您的代码逻辑中的一个错误。这是另一个 - 文件扩展名并不意味着什么。将 PDF 从 .pdf 重命名为 .bob,您仍然可以使用 Acrobat Reader 打开它。

标签: php html


【解决方案1】:

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

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

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

【讨论】:

  • 它给了我警告。 Warning: POST Content-Length of 681075903 bytes exceeds the limit of 33554432 bytes in Unknown on line 0。还是同样的问题。
  • PHP 警告涉及 681 075 903 字节 (681 Mb) 的大小。为了允许这个文件,你必须设置一个更大的值。用 1G 试试
  • @ Pierre-Olivier Vares 它可以工作,但没有给出错误消息“对不起,您的文件太大。只允许 3MB”而是成功上传到数据库。这不是我想要的。
  • @Hazirah_Halim 那是因为您使用的是&gt; 而不是&lt; ... 那是我指出的逻辑错误。
  • @CD001 对不起,我忘了告诉你我已经按照你说的做了。我应该简单地解释这个问题,而不是仅仅说“不”会导致误解。我已经在使用&lt;,但它仍然给了我同样的警告发布错误。
【解决方案2】:

你能发布表单的 HTML 代码吗?

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

它值得进行额外的测试,但要确定:

此外,尝试在输入中设置 maxlength 属性也很有趣,正如 RFC-1867 中所述。

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

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

这将允许直接在尊重 RFC 的浏览器中禁止上传。

【讨论】:

  • 已编辑。请再次检查我的问题。
  • 总结: * 包括一个 maxlength 属性(对于响应 RFC 的浏览器) * 包括 MAX_FILE_SIZE 隐藏输入 * 将 post_max_size 设置为更大的值;但是,根据定义,您将无法捕获大于该值的文件(因为 PHP 在运行脚本之前会拒绝它)。 * 将 max_upload_size 设置为您想要的最大值。 PHP 将在 $_FILES 数组中为您生成一个“错误”键
猜你喜欢
  • 2011-09-10
  • 1970-01-01
  • 2016-08-21
  • 2016-02-06
  • 2012-07-29
  • 2016-11-25
  • 2022-07-06
  • 2013-02-15
相关资源
最近更新 更多