2012-02-21 3 views
0

У меня есть эта функция, которая проверяет имя файла. Если он существует, то он увеличивает его на единицу после этого скороговоркой:PHP инкрементные имена файлов

image.jpg 
image1.jpg 
image2.jpg 

Проблема приходит на 4-изображения, он возвращается с 0.jpg.

Вот соответствующий код:

... 
$filetarget = $this->make_image_filename($directory, $new_filename, $extension); 

if(!move_uploaded_file($file['tmp_name'], $filetarget)){ 
    $error[$index] = 'copy'; 
} 
... 

private function make_image_filename($directory, $name = '', $extension){ 
    if(empty($name)) $name = 'NULL'; 
    $filetarget = $directory.$name.$extension; 

    if(file_exists($filetarget)){ 
     $name = $this->increment_filename($name); 

     return $this->make_image_filename($directory, $name, $extension); 
    } else { 
     return $filetarget; 
    } 
} 


private function increment_filename($name){ 

    $index = $this->get_filename_index($name); 

    if(is_numeric($index)){ 
     $pos = strpos($name, $index); 
     $name = substr($name, 0, $pos); 
    } 

    if(is_null($index)){ 
     $index = 0; 
    } 

    ++$index; 

    return $name.$index; 
} 

private function get_filename_index($name){ 
    // CHECK FOR INDEX 
    $i = 1; 
    $index = substr($name, -$i); 
    $last_chars = substr($name, -$i); 

    while(is_numeric($last_chars)){ 
     ++$i; 
     $last_chars = substr($name, -$i); 
     if(is_numeric($last_chars)){ 
      $index = $last_chars; 
     } 
    } 

    if(is_numeric($index)){ 
     return $index; 
    } else { 
     return NULL; 
    } 
} 

Я нахожусь в процессе выделения теперь этот код на моем локальном сервере запустить несколько тестов. Можете ли вы увидеть что-то по своей сути ошибочное в этом процессе?

+1

Покажешь код, где вы вызываете 'make_image_filename()' Я не вижу никаких проблем, и, пытаясь выполнять свои функции, у меня нет никаких проблем с увеличением. Поэтому, возможно, проблема заключается в том, что параметры отправляются на 'make_image_filename()' в течение 4-х раз. – Kokers

+2

Выглядит хорошо для меня, было бы полезно увидеть, где вызывается 'make_image_filename()'. Однако, похоже, что 'increment_filename()' может нести ответственность за возврат '0', если' $ name' - пустая строка ('.0 ==' 0 '). – Josh

ответ

1

Вот функция, я использую, чтобы сделать то же самое:

function make_unique($full_path) { 
    $file_name = basename($full_path); 
    $directory = dirname($full_path).DIRECTORY_SEPARATOR; 

    $i = 2; 
    while (file_exists($directory.$file_name)) { 
     $parts = explode('.', $file_name); 
     // Remove any numbers in brackets in the file name 
     $parts[0] = preg_replace('/\(([0-9]*)\)$/', '', $parts[0]); 
     $parts[0] .= '('.$i.')'; 

     $new_file_name = implode('.', $parts); 
     if (!file_exists($new_file_name)) { 
      $file_name = $new_file_name; 
     } 
     $i++; 
    } 
    return $directory.$file_name; 
} 

(за исключением того, сделать имена файлов, как image(1).jpgimage(2).jpg)

+0

Удивительный, спасибо @Petah! – AVProgrammer

0

Как об этом:

function get_next_file_name($file) { 
    if (!preg_match('/^(\D+)(\d*)(\.\S+)$/', $file, $match)) { 
     throw new Exception('bad file name format'); 
    } 
    return $match[1] . (empty($match[2]) ? 1 : ($match[2] + 1)) . $match[3]; 
} 
echo get_next_file_name('image.jpg'), "\n";  // prints image1.jpg 
echo get_next_file_name('image1.jpg'), "\n";  // prints image2.jpg 
echo get_next_file_name('image999.jpg'), "\n"; // prints image1000.jpg 
+0

Регулярное выражение, похоже, не работает ... – AVProgrammer

Смежные вопросы