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.