Autor Zpráva
Enko
Profil *
Ahoj,
jak řešíte přejmenování nahraného souboru přes webový formulář? Řeším to takto a zajímá mě případné jiné či lepší řešení.

Díky

<?php
  $micro = microtime();
  $micro = explode(" ", $micro);
  $micro = $micro[0];
  $micro = explode("0.",$micro);
  $micro = $micro[1]; //zjištění mikrosekund
  mb_internal_encoding('UTF-8'); //zajištění správného kódování pro fci mb_string()
  $micro = mb_substr($micro, 0, 6); //zkrácení o poslední 2 nuly, které tam jsou vždy
  $jmeno = md5(date("YmdHis").$micro); // zahešování jména souboru, aby nebylo na první pohled poznat, kdy to uživatel nahrál
  $koncovka = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION); //zjištění koncovky nahrávaného souboru
  $photo = $jmeno.".".$koncovka; //výsledné jméno souboru
?>
Jan Tvrdík
Profil
Enko:
V čem je to lepší, než
$jmeno = md5(uniqid());
?
Enko
Profil *
Jan Tvrdík:
uniqid() mě nenapadlo, díky :)
Darker
Profil
Proč vůbec hashovat uniqid? Jinak ještě kontroluj, zda stejný soubor neexistuje - hash různých hodnot může být stejný. Pokud existuje, připoj za jméno číslo.


A pokud nahráváš obrázky asi bys měl omezit přípony jen na přípony obrázků.
Enko
Profil *
Darker:
Proč vůbec hashovat uniqid?
Pravda, odstraněno.

Jinak ještě kontroluj, zda stejný soubor neexistuje - hash různých hodnot může být stejný. Pokud existuje, připoj za jméno číslo
Tuto kontrolu udělám.

A pokud nahráváš obrázky asi bys měl omezit přípony jen na přípony obrázků.
Toto už mám ošetřené

Nakonec jsemt o vyřešil takto:
$jmeno = uniqid('',true);
Darker
Profil
Kontrola na existující soubor:
$jmeno =  uniqid('',true);
$pripona = /*zjisteni pripony*/;
$cislo = 0;
$tmpjmeno=$jmeno;
while(file_exists("slozka/$tmpjmeno.$pripona")) {
  $tmpjmeno=$jmeno.$cislo;
  $cislo++;
} 
Snad tam nemám nějakou chybu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: