文件上传不适用于所有文件

时间:2013-08-10 11:06:46

标签: php

我使用下面的代码上传一些允许扩展名低于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 !
}

2 个答案:

答案 0 :(得分:3)

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

你应该 chech php.ini设置 upload_max_filesizepost_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;

希望这有帮助!

相关问题