Sprawdzamy name, extension i mime-type uploadowanych plików. Do dzieła.

Najpierw formularz:

<form action="http://localhost/sometry/upload2.php" method="POST" enctype="multipart/form-data">
    <input type="file" name="file" id="file">
    <input type="submit" value="Send POST MULTIPART">
</form>

Teraz akcja:

print_r($_FILES);
//Array ( [file] => 
//Array ( [name] => code.png 
// [full_path] => code.png 
// [type] => image/png 
// [tmp_name] => C:\xampp\tmp\php3A8E.tmp 
// [error] => 0 
// [size] => 1616174 ) 
// )

Jak widać plik tymczasowy ma rozszerzenie .tmp i to ten plik trzeba sprawdzić, nie ufając temu, co w type.

Sprawdźmy jego mime-type:

function getMimeType($file='file') {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime_type = finfo_file($finfo, $_FILES[$file]['tmp_name']);
    return $mime_type;
}

print_r($_FILES);
//Array ( [file] => 
//Array ( [name] => code.png 
// [full_path] => code.png 
// [type] => image/png 
// [tmp_name] => C:\xampp\tmp\php3A8E.tmp 
// [error] => 0 
// [size] => 1616174 ) 
// )
echo getMimeType();
//image/png

Nazwę oryginalnego pliku należy rozbić na nazwę i rozszerzenie, posługując się kluczem name:

function getFilename($file='file'){
    $pathinfo = pathinfo($_FILES[$file]["name"]);
    return $pathinfo['filename'];
}

function getFileExtension($file='file'){
    $pathinfo = pathinfo($_FILES[$file]["name"]);
    return $pathinfo['extension'];
}

print_r($_FILES);
//Array ( [file] => 
//Array ( [name] => code.png 
// [full_path] => code.png 
// [type] => image/png 
// [tmp_name] => C:\xampp\tmp\php3A8E.tmp 
// [error] => 0 
// [size] => 1616174 ) 
// )
echo getFilename();
//code
echo getFileExtension();
//png

Teraz przydałaby się jakaś obsługa nazw – usuwanie zbędnych znaków, trimowanie długości, suffixowanie jeżeli plik o takiej nazwie już istnieje:

function createNewFilename($file='file'){

    $pathinfo = pathinfo($_FILES[$file]["name"]);

    $base = $pathinfo['filename'];
    $extension = $pathinfo['extension'];

    $base = preg_replace('/[^a-zA-Z0-9_-]/', '_', $base);
    $base = mb_substr($base, 0, 200);

    $filename = $base . "." . $extension;

    $destination = __DIR__ . "/uploads/$filename";
    $i = 1;

    while (file_exists($destination)) {
            $filename = $base . "-$i." . $extension;
            $destination = __DIR__ . "/uploads/$filename";
            $i++;
        }
    return $filename;
}

print_r($_FILES);
//Array ( [file] => 
//Array ( [name] => code.png 
// [full_path] => code.png 
// [type] => image/png 
// [tmp_name] => C:\xampp\tmp\php3A8E.tmp 
// [error] => 0 
// [size] => 1616174 ) 
// )

echo createNewFilename();
//code-1.png

Wszystko działa.