Jak v PHP získat unikátní název souboru, který v adresáři neexistuje
Článek je další rozšíření knihovny File, který řeší snadné nalezení unikátního (originálního) jména souboru v dané cestě a vrací nový název souboru.
V rámci tohoto serveru a tipů, zde uvedených je postupně uvolňována knihovna File, která zahrnuje běžné operace potřebné pro práci se soubory. Předchozí díl řešil otázku: Jak nabídnou soubor ke stažení.
Tento díl řeší jak nalézt v daném adresáři unikátní název souboru.
- <?
- class File {
- public function __construct() { }
- public static function getOriginalName($path, $file) {
- $i=0;
- while (file_exists($path.$file)) {
- $pos = strrpos($file, ".");
- $ext = strtolower(substr($file , $pos+1));
- if (preg_match("/.+-CID(d+).[a-zA-Z]{3,4}$/", $file)) {
- $file = preg_replace("/(.+)(-CIDd+)(.[a-zA-Z]{3,4}$)/", "$1-CID".$i, $file);
- } elseif (preg_match("/.+(.)[a-zA-Z]{3,4}$/", $file)) {
- $file = preg_replace("/(.+)(.[a-zA-Z]{3,4})$/", "$1-CID".$i, $file);
- } else {
- $file = "FILE-CID".$i.".".$ext;
- }
- $i++;
- $file = $file.".".$ext;
- }
- return $file;
- }
- }
- ?>
Skript rozdělí soubor na název a jeho příponu, vyzkouší zda v dané cestě existuje, pokud ano, přidá nakonec text CID a pořadové číslo, tento cyklus pokračuje tak dlouho dokud není nalezen unikátní název souboru, který je funkcí vrácen.
Celá funkce v rámci třídy se dá používat voláním File::getOriginalName("../cesta/", "unikatnisoubor.txt");.
komentáře
RSS Komentáře
určitě vyřešilo, ale kdo se v tom má vyznat soubor.png soubor1578469113.png soubor1546465113.png soubor1579799113.png
nebo
soubor.png soubor-CID1.png soubor-CID2.png soubor-CID3.png
myslím tím, když někdo obrázek stahuje, nebo na serveru vybíráš příslušný obrázek, tak salt (timestamp atd, nic neřekne), každopádně ať každý používá co mu vyhovuje :) tohle je jen návrh jak to dělám já
Jasne to jsem spatne zkopiroval
Jak rikam tento kod
$file = ‚test.png‘; $file = File::getOriginalName('', $file); file_put_contents($file, date(‚h:i:s‘));
a pote F5 ( nekolikrat ) a vytvari mi soubory
test-CID0-CID1.png test-CID0-CID1-CID2.png test-CID0-CID1-CID2-CID3.png
Diky
[code] class File {
public function __construct()
{
}
public static function getExtension($file)
{
preg_match(„~(.+).(.+)~“, $file, $out);
return $out[2];
}
public static function getHoleFilename($file)
{
preg_match(„~(.+).(.+)~“, $file, $out);
return $out[1];
}
public static function getOriginalName($file = '', $path = '')
{
$orig_file = $file;
if (!is_file($path . $file))
return $file;
$i = 0;
do
{
$file = self::getHoleFilename($orig_file) . ‚-CID‘ . $i . ‚.‘ .
self::getExtension($file);
$i++;
}
while(is_file($path . $file));
return $file;
} } [/code]
A porad nejak nevim kde je u Tebe chyba, ale kdyz to napises rad se na to podivam
Kód nerespektuje fakt, že jeden skript může být v prostředí webové aplikace spuštěn paralelně vícekrát. Viz http://php.vrana.cz/…-operaci.php
PHP funkce tempnam() tento fakt respektuje.



Zdravím mám dotaz, co má být na začátku a na konci ve $file?