2013-04-21 21 views
13

Próbuję zmienić nazwę pliku obrazu, gdy jest on przesłany, jeśli istnieje, powiedz, czy moja nazwa pliku to test.jpg i już istnieje Chcę zmienić nazwę na obraz jako test1.jpg a następnie test2.jpg i tak dalej. Z kodem, który napisałem, zmieniając moją nazwę pliku tak, jak test1.jpg, a następnie test12.jpg, wszelkie porady dotyczące naprawiania tego byłyby wspaniałe!PHP Zmień nazwę Nazwa pliku, jeśli istnieje, dodaj numer do końca

PHP

$name = $_FILES['picture']['name']; 
$actual_name = pathinfo($name,PATHINFO_FILENAME); 
$extension = pathinfo($name, PATHINFO_EXTENSION); 

$i = 1; 
while(file_exists('tmp/'.$actual_name.".".$extension)) 
{   
    $actual_name = (string)$actual_name.$i; 
    $name = $actual_name.".".$extension; 
    $i++; 
} 
+0

jasne zmienna $ actual_name kiedyś ponieważ jego pętla robiąc co jakiś tak, $ acutal_name = „” –

+0

Można by przetestować nazwę z '$ I' w' while' pętli .. jak w '" tmp /".$ actual_name. $ i. ".". $ extension' i utwórz wartość '$ name' po pętli while' $ name = "tmp /".$ actual_name. $ i.". ". $ extension' – dbf

Odpowiedz

30

Oto drobne modyfikacje, które myślę, że powinni robić to, co chcesz:

$actual_name = pathinfo($name,PATHINFO_FILENAME); 
$original_name = $actual_name; 
$extension = pathinfo($name, PATHINFO_EXTENSION); 

$i = 1; 
while(file_exists('tmp/'.$actual_name.".".$extension)) 
{   
    $actual_name = (string)$original_name.$i; 
    $name = $actual_name.".".$extension; 
    $i++; 
} 
0

Istnieje kilka sposobów na zmianę nazwy obrazu w PHP przed wysłaniem do serwera. dołączanie znacznika czasowego, unikalnego identyfikatora, wymiarów zdjęcia plus losowego numeru itp. Możesz je zobaczyć wszystkie here

Najpierw sprawdź, czy nazwa pliku obrazu istnieje w folderze hostowanego obrazu, w przeciwnym razie prześlij go. Pętla while sprawdza, czy nazwa pliku obrazu istnieje i dołącza unikalny identyfikator, jak pokazano poniżej ...

function rename_appending_unique_id($source, $tempfile){ 

    $target_path ='uploads-unique-id/'.$source; 
    while(file_exists($target_path)){ 
     $fileName = uniqid().'-'.$source; 
     $target_path = ('uploads-unique-id/'.$fileName); 
    } 

    move_uploaded_file($tempfile, $target_path); 

} 

if(isset($_FILES['upload']['name'])){ 

    $sourcefile= $_FILES['upload']['name']; 
    tempfile= $_FILES['upload']['tmp_name']; 

    rename_appending_unique_id($sourcefile, $tempfile); 

} 

zobacz więcej obraz renaming tactics

3

Zainspirowany od @Jason odpowiedź, stworzyłem funkcję który uznałem za krótszy i bardziej czytelny format pliku.

function newName($path, $filename) { 
    $res = "$path/$filename"; 
    if (!file_exists($res)) return $res; 
    $fnameNoExt = pathinfo($filename,PATHINFO_FILENAME); 
    $ext = pathinfo($filename, PATHINFO_EXTENSION); 

    $i = 1; 
    while(file_exists("$path/$fnameNoExt ($i).$ext")) $i++; 
    return "$path/$fnameNoExt ($i).$ext"; 
}