我使用下面的代码上传一些允许扩展名低于5MB的文件。但是使用此代码,所有doc或pdf等都不会上传! 例如:4.78MB docx文件或Windows手机1.64 mb jpg无法上传!
$allowedExts = array("gif", "jpeg", "jpg","png","pdf","doc","docx","txt","rtf","bmp","psd","zip","rar","ppt","pptx");
$extension = end(explode(".", $_FILES["file"]["name"]));
if (in_array($extension, $allowedExts) && $_FILES["file"]["size"]<5242880 && $_FILES["file"]["error"]<=0) {
$rand = rand(000,999);
$tempfile = $_FILES["file"]["name"];
$file = $time . "=" . $rand . "=" . $tempfile;
if(file_exists("upload/".$file)) {
header("location:home.php?error=error");
} else {
move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$file);
}
} else {
header("location:home.php?error=error"); //this gets executed for some doc or pdf files !
}
答案 0 :(得分:3)
对于该文件“Holidays.docx”,在我看来文件超过upload_max_filesize
。至少这就是var_dump所说的关于$_FILES['file']['error']
的内容,它等于1(UPLOAD_ERR_INI_SIZE)
你应该 chech php.ini设置 upload_max_filesize
和post_max_size
,因为这是大型文件上传到服务器的实际限制。默认情况下upload_max_filesize = 2M
所以你的5MB限制意味着什么。
此外,您可以使用ini_get('upload_max_filesize');
来获取运行时设置
如果您不确定您的php.ini配置文件位于何处,请使用phpinfo()
。
另外要知道的是,如果文件超出文件大小限制,PHP将返回$_FILES['file']['size']
等于0 - 这正是发生的事情。
所以IMO一切正常。您应该为其他未上传的文件发布更多var_dump()信息。
另请注意,您不会以不区分大小写的方式检查文件扩展名,因此您的脚本将不会接受扩展名为.DOCX
的文件。
答案 1 :(得分:3)
您在if语句中组合了三个条件,如果其中一个失败,则else
块将执行。但它不会告诉你哪种情况失败了。
if ( in_array($extension, $allowedExts) && $_FILES["file"]["size"]<5242880 &&
$_FILES["file"]["error"]<=0) {
这里:
in_array($extension, $allowedExts)
- 来自您的var_dump
输出,这似乎是正确的。
$_FILES["file"]["error"]<=0)
- 这没关系,但你不需要检查它是否 小于0.错误的范围是1到8,不会去低于0,但这不会导致任何问题。
$_FILES["file"]["size"]<5242880
- 这可能会失败。检查您的php.ini
配置,找出upload_max_size
的内容。如果它小于文件的文件大小,则条件将失败并且else块将执行。
出于疑难解答的目的,我建议在单独的块中拆分if
语句。这样,您就会明白哪个部分正在执行,并会帮助您找出原因。
一个例子:
$check = True;
if (!condition) {
$check = False;
}
if (!condition) {
$check = False;
}
if (!condition) {
$check = False;
}
if ($check == True) {
# code...
}
以下是您的代码的其他一些小改进:
您目前正在使用:
$extension = end(explode(".", $_FILES["file"]["name"]));
获取图片扩展名。如果扩展名不同,则可能会失败。
将其更改为:
$extension = strotolower( end(explode(".", $_FILES["file"]["name"])) );
或更好:
$extension = strtolower( pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION) );
其次,您在以下语句中使用$time
变量:
$file = $time . "=" . $rand . "=" . $tempfile;
该变量未在任何地方定义,PHP在运行脚本时会抛出Undefined variable
错误。将其更改为:
$time = time();
$file = $time . "=" . $rand . "=" . $tempfile;
希望这有帮助!