0

単純な画像アップロードを作成しようとしていますが、画像をアップロードしようとすると、無効なファイルであるというエラーが表示されます。誰かが私が間違っていることを教えてもらえますか?

これが私のコードです:

<?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);
    }

?>
4

3 に答える 3

2

「extensions」と「extensions」のタイプミスがあります。修正された場合は、ファイルをで確認してくださいis_uploaded_file

in_array($extension, $allowExts)in_array($extensions, $allowExts)またはの名前$extensionsである必要があります$extension

次のような要素1を使用する必要があります$extension[1]

于 2013-02-18T16:44:46.610 に答える
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など、任意の名前を付けてくださいform。一致するようにhtmlのを変更してください。"upload"フォルダを777にchmodするようにしてください。この方法で行うと、無期限に機能するはずです。私はいつもそれを機能させるのが最善だと思っています。それから戻ってセキュリティに取り組みます。たとえば、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のセキュリティリスクは常に恐ろしいものです。アップロードされたファイルだけがそこにある限り、問題はありません。

于 2013-02-18T19:14:14.537 に答える
0

コメントから、サイズ制限を超えるファイルをアップロードしていることがわかります。実際のファイルサイズはオペレーティングシステムによってわずかに異なる可能性があるため、十分に大きな制限を使用してください。

個々のチェック(タイプ、サイズ、拡張子)を実行し、無効な拡張子、無効なタイプなど、より詳細な意味のあるエラーを返すファイル検証関数を作成する価値があるかもしれません。これにより、将来のデバッグが容易になります。 。

于 2013-02-18T17:40:57.637 に答える