Esta función definida en form/controller/application_controller.php
guardaba un archivo de nombre $name en el directorio $dir, pero si se
subía un archivo cuyo nombre estaba repetido entonces lo machacaba y
se perdía el primero.
He modificado esta función par que esto no ocurra y además devuelve la
ruta completa al archvo.
Por si puede ser de ayuda la dejo aquí:
public function upload_filem($name, $dir){
if($_FILES[$name]){
// Si hay fichero que subir, calculamos la longitud del nombre
$len = strlen($_FILES[$name]);
// Capturamos la extensión del fichero
$ext = strrchr($_FILES[$name], ".");
// Preparamos la cadena para que contenga sólo caracteres
compatibles
// y minúsculas, para ello la pasamos a minúsculas y la separamos
de la extensión
$filnam = strtolower(substr($_FILES[$name], 0, $len -
strlen($ext)));
// Filtramos cualquier caracter indeseado
$filnam = strtr(trim($filnam), " ¿?¡!
@#¬\"\\/|ºª·$%&()=+-[]
{};',àèìòùáéíóúäëïöüâêîôûñÑ",
"______________________________aeiouaeiouaeiounn");
// Establecemos el nombre final
$fileup = $filnam.$ext;
while (
@file_exists($dir."/".$fileup))
$fileup = $filnam."_".(++$k).$ext;
// Movemos el fichero subido al destino indicado
move_uploaded_file($_FILES[$name], $dir."/".
$fileup);
return $dir."/".$fileup;
} else return false;
}
Comentarios
Lo separo con dos guiones bajos, es muy poco probable que alguien nombre a un archivo con dos guiones bajos, aunque cualquier otro carácter permitido serviría. A la hora de presentarlo en la vista hago un explode y ya está.
Esto tuve que hacerlo por si habían dos usuarios que subían archivos con el mismo nombre, al tener el timestamp hasta los segundos es muy difícil que coincida con nadie. Se puede añadir seguridad con un random también.