RM\Utils\Unique - riešenie kolízií názvov súborov

Takmer každý web obsahuje upload súborov. Pri uploade je zväčša potrebné kontrolovať existenciu súboru s rovnakým názvom. Ak náhodou takýto súbor už existuje, tak sa hodí súbor premenovať na unikátny.

Riešil som to mnoho krát a už ma prestalo baviť zakaždým rozkopírovávať kód metódy. Takto vznikol jednoduchý nástroj Unique.

Ukážka použitia

Potrebujem napríklad nahrať súbor nieco.jpg do priečinka /images. Ak sa súbor nemá prepísať, musím zistiť či súbor s takýmto názvom v priečinku existuje. Ak áno, tak musím vytvoriť nový názov súboru, overiť jeho existenciu a tak ďalej.

S využitím Unique stačí zavolať:

$newFilename = RM\Utils\Unique::get('nieco.jpg', '/images');

Metóda get() dostane ako parametre názov súboru ktorý chceme uložiť a cestu k priečinku. Ak je názov súboru neobsadený, tak ho rovno vráti. Inak vygeneruje nový unikátny názov súboru vo formáte <názov súboru><<oddelovač>poradové číslo>.<prípona>.

Takže ak sa v priečinku bude nachádzať súbor nieco.jpg, tak sa vygeneruje názov nieco-1.jpg. Ak súbor uploadujeme znovu, tak nieco-2.jpg.

Príklad použitia v Nette formulároch

if ($form['image']->isOk()) {
    $newName = RM\Utils\Unique::get($form['image']->getSanitizedName(), $this->uploadDir);
    $form['image']->move($this->uploadDir . DIRECTORY_SEPARATOR . $newName);
    $form['image'] = $newName;
}
$table->insert($form);

Oddelovač

Ak sa mi niečo nebude páčiť na oddelovači -, tak ho je možné jednudcho zmeniť:

RM\Utils\Unique::$separator = '|';

Inštalácia

Keďže žijeme v modernej dobe, tak najjednuduchšie je funkcionalitu obaliť do composer balíka ;)

$ composer require rm/unique

Na záver

Viem, je to blbosť, ale niekomu to možno pár minút ušetí ;)

Prípadné hlásenia chýb alebo námety na vylepšenia smerujte prosím na Issue tracker.