图像上传器错误

时间:2013-02-18 16:34:21

标签: php file-upload image-uploading

我正在尝试构建一个简单的图片上传,但是当我尝试上传任何图片时,我收到错误,告诉我文件无效。谁能告诉我我做错了什么?

这是我的代码:

<?php

    $allowExts = array("jpg", "jpeg", "gif", "png", "stl");
    $extensions = end(explode(".", $_FILES["file"]["name"]));

    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/png")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/stl"))
    && ($_FILES["file"]["size"] < 21000)
    && in_array($extension, $allowExts))

    {
        if ($_FILES ["file"]["error"] > 0){
        echo "ERROR: " . $_FILES["file"]["error"] . "<br>";
        }

        else{
            echo "Upload: " . $_FILES["file"]["name"];
            echo "Type: " . $_FILES["file"]["type"];
            echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
            echo "Stores in: " . $_FILES["file"]["tmp_name"];

            if (file_exists("upload/" . $_FILES["file"]["name"])){
                echo $FILES["file"]["name"] . "already exists. ";
            }
            else{
                move_uploaded_file($_FILES["file"]["tmp_name"],
                "upload/" . $FILES["file"]["name"]);
                echo "Stored in: " . "upload/" . $FILES["file"]["name"];
            }
        }
    }
    else{
        echo "Invalid File";
        }

?>

以下是根据我所做的修改调整后的文件:

<?php

$allowExts = array("jpg", "jpeg", "gif", "png", "stl");
$extension = end(explode(".", $_FILES["file"]["name"]));

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/stl"))
&& ($_FILES["file"]["size"] < 30000000)
&& in_array($extension, $allowExts))

{
    if ($_FILES ["file"]["error"] > 0){
    echo "ERROR: " . $_FILES["file"]["error"] . "<br>";
    }

    else{
        echo "Upload: " . $_FILES["file"]["name"] . "<br>";
        echo "Type: " . $_FILES["file"]["type"] . "<br>";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "Stores in: " . $_FILES["file"]["tmp_name"] . "<br>";

        if (file_exists("images/" . $_FILES["file"]["name"])){
            echo $FILES["file"]["name"] . "already exists. ";
        }
        else{
            move_uploaded_file($_FILES["file"]["tmp_name"],
            "images/" . $FILES["file"]["name"]);
            echo "Stored in: " . "images/" . $FILES["file"]["name"];
        }
    }
}
else{
    echo "Invalid File";
    print_r($_FILES);
    }

?>

3 个答案:

答案 0 :(得分:2)

有一个拼写错误的“扩展名”和“扩展名”。如果已修复,请使用is_uploaded_file检查您的文件。

in_array($extension, $allowExts)必须为in_array($extensions, $allowExts)或将$extensions命名为$extension

您必须使用$extension[1]

之类的元素1

答案 1 :(得分:1)

让我们简单一点吧; HTML应如下所示:

<form method='POST' action="upload.php" enctype="multipart/form-data" >

<input type="file" name="userfile" id="userfile"  />

<input type="submit" value="upload" />

</form>

你的PHP,试试这个:

<?php
//GRAB IMAGE FROM POST
$pic = $_FILES['userfile'];
$picName = $_FILES['userfile']['name'];

$file_ext =  strtolower(end(explode(".", $picName )));



if($file_ext == "jpg" || $file_ext == "jpeg" || $file_ext == "gif" || $file_ext == "png" ){

    //MAKE SURE YOU HAVE CHMOD 777 THIS DIRECTORY AND DOUBLE CHECK THIS IS THE CORRRECT DIRECTORY!
    $theDirectory = 'upload/theImage.'.$file_ext;

    //MOVE THE FILE TO THIS DIRECTORY
    move_uploaded_file($pic['tmp_name'], $theDirectory);


}
else{


        echo 'bad file';
}

?>

验证文件有点麻烦,但它可以解决问题。确保将php文件命名为upload.php或任何你想要的名称,只需确保更改html上的form即可。确保你将文件夹"upload" chmod到777.这样做应该无限期地工作。我总是觉得最好让它工作,然后回去开展安全工作。例如,您应该使用GD库通过执行类似的操作来验证它是合法的图像(这个位可能需要调整):

//MAKE IT A JPEG

$theDirectoryTwo = 'upload/theImageValidated.jpg';
$theRawImage = file_get_contents($theDirectory);
$theRawImage = imagecreatefromstring($theRawImage);
imagejpeg($theRawImage, $theDirectoryTwo);

除非有人试图将文本文件命名为“anImage.jpg”,否则每次运行都会产生完美的jpeg,上面的位会产生一个黑色的图像。只需要安装GD库就可以了。

科西嘉总是存在可怕的Chmod 777安全风险,只要只上传文件进入那里,你应该没问题,没有任何问题。

答案 2 :(得分:0)

从评论中我可以看到您上传的文件超出了大小限制。不同操作系统的实际文件大小可能略有不同,因此请务必使用足够大的限制。

创建一个文件验证函数可能是值得的,该函数执行每个单独的检查(类型,大小,扩展名)并让它返回更有细节的有意义的错误,例如无效扩展,无效类型等。这将使它更容易将来调试。