sabato 25 luglio 2009

PHP: rinominare file con estensione

PROBLEMA: Eseguire l'upload di un file il cui nome è già presente nella directory di destinazione sul server.

UNA POSSIBILE SOLUZIONE: rinominare il file aggiungendo alla fine la data e l'ora (si suppone che nello stesso secondo non possano avvenire due upload in contemporanea -> OK nei siti con pochi accessi). Esempio:
il file che voglio caricare si chiama pippo.jpg, ma sul server già esiste un file con lo stesso nome. Il file sarà rinominato in:
pippo_1:51:05-22.07.09.jpg
Vogliamo inoltre tener conto della situazione in cui il file non possiede un'estensione, in questo caso il file pippo sarà rinominato in:
pippo_1:51:05-22.07.09

CODIFICA
: non è possibile semplicemente aggiungere data e ora alla fine del file perchè il risultato sarebbe il seguente:
pippo.jpg_1:51:05-22.07.09
L'idea è quella di separare il nome del file dall'estensione, rinominare solo il nome del file e infine aggiungere l'estensione al file rinominato.
Tralasciamo il codice per eseguire l'upload e chiamiamo $fname la variabile che contiene il nome del file che sta per essere caricato.
(in breve sia
<input type="file" name="user_file" />
$file = $_FILES['user_file'];
$fname = $file['name']
)
Ora veniamo al codice:
if (file_exists($filename)) {
//FILE GIA ESISTENTE, lo rinominiamo per non sostituirlo
// ricava l'estensione dal file
$estensione_file=estensione($fname);
//taglia l'estensione dal file
$fname=cut_extension($fname);
// assegna un nome univoco al file rinominando il nome del file e aggiungendo alla fine l'estensione
$fname=rename_file($fname).".".$estensione_file;
}
Di seguito le funzioni estensione, cut_extension, rename_file:
function estensione($nome){
$trova_punto = explode(".", $nome);
$estensione = $trova_punto[count($trova_punto) - 1];
$estensione = strtolower($estensione);
if (isset($trova_punto[1]) == FALSE){
return ""; //NESSUNA ESTENSIONE
}
return $estensione;
}

function cut_extension($nome){
$trova_punto = explode(".", $nome);
if(count($trova_punto)==1){//ALLORA é UN FILE CHE NON HA ESTENSIONE
$new_nome=$trova_punto[0];
}
else{
for($i=0;$i<count($trova_punto)-1;$i++){
$new_nome.=$trova_punto[$i];
//nel caso il file contenga più punti ripristina i punti centrali
if($i<count($trova_punto)-2)
$new_nome.=".";
}
}
return $new_nome;

function rename_file($file){
$suffisso= date("_g:i:s-d.m.y");
$new_file_name=$file.$suffisso;
return $new_file_name;
}