我想测试一下文件上传代码。这是一个上传文件代码,它可以选择用户是否有要上传的文件,或者只是空白地提交。我添加了错误消息以限制文件扩展名。它有效。
然后,我添加了一条错误消息,通知用户有关限制文件的大小。但不知何故得到了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 ){
部分,但我仍然希望我的用户可以选择上传。
答案 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的浏览器中禁止上传。