Krosty:
Una pregunta esto que hace: rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$_SERVER['PHP_SELF'] devuelve la ruta local más el nombre del script que se está ejecutando actualmente relativo al home virtual en el servidor, por ejemplo si la URL del script es:
http://www.example.com/dir1/dir2/script.php $_SERVER['PHP_SELF'] contiene
dir1/dir1/script.phpdirname() extrae el path de la cadena pasada como parámetro, como esa cadena contiene $_SERVER['PHP_SELF'] entonces devuelve
dir1/dir1rtrim() borra caracteres por la derecha (es decir por el final de la cadena), en este caso elimina la barra final de lo que devuelve dirname(), esto lo hice para prevenir que apareza una doble barra cuando el script está en el home, en ese caso dirname devuelve "/" lo que causaría una doble barra en la URL después.
Para ver si un archivo ya existe podrías hacer algo así:
if (is_file("jaja.jpg")) { echo "El archivo ya existe"; }
else { echo "El archivo no existe"; }
Para asignar un nuevo nombre de archivo a un nuevo archivo cuyo nombre ya existe podrías hacer algo como esto:
function getFileExtension($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
} // getFileExtension
function getFileName($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
return substr($str,0,$i);
} // getfilename
$archivo = $_FILES ['foto']['name']; // agregado según tu código.
if (is_file($archivo)) {
$a = 0;
do {
$a++;
$archivo = GetFileName($archivo).$a.".".GetFileExtension($archivo);
} while (is_file($archivo));
}
echo $archivo;
En
$archivo tendrás el nuevo nombre.
Seguramente alguien más tiene una solución mejor.