2

我正在使用下面的代码上传一些允许扩展名低于 5MB 的文件。但是使用此代码,所有 doc 或 pdf 等都没有上传!例如:4.78MB docx 文件或 windows phone 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 !
}
4

2 回答 2

3

对于该文件“Holidays.docx'”,在我看来该文件超过了upload_max_filesize. 至少这就是 var_dump 所说$_FILES['file']['error']的等于 1 ( UPLOAD_ERR_INI_SIZE )

您应该检查 php.ini 设置 upload_max_filesizepost_max_size因为这是可以将大文件上传到服务器的实际限制。默认情况下upload_max_filesize = 2M,您的 5MB 限制没有任何意义。

您也可以ini_get('upload_max_filesize');用来获取运行时设置。
如果您不确定 php.ini 配置文件在哪里,请使用phpinfo().

另外要知道的是,$_FILES['file']['size']如果文件超过文件大小限制,PHP 将返回等于 0 - 这正是发生的事情。

因此,IMO 一切正常。您应该为其他未上传的文件发布更多 var_dump() 信息。

另请注意,您不会以不区分大小写的方式检查文件扩展名,因此.DOCX您的脚本不会接受带有扩展名的文件。

于 2013-08-10T11:35:11.463 回答
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;

该变量未在任何地方定义,Undefined variable当您运行脚本时 PHP 会抛出错误。将其更改为:

$time = time();
$file = $time . "=" . $rand . "=" . $tempfile;

希望这可以帮助!

于 2013-08-10T11:41:55.183 回答