2013-06-24 2 views
1

Как я могу изменить имя загружаемого файла в Laravel 4. До сих пор я делал это так:Изменить имя файла Laravel 4

$file = Input::file('file'); 
$destinationPath = 'public/downloads/'; 
if (!file_exists($destinationPath)) { 
    mkdir("./".$destinationPath, 0777, true); 
} 
$filename = $file->getClientOriginalName(); 

Но если у меня есть 2 файла с тем же именем, я думаю, он переписывается, поэтому я хотел бы добавить что-то вроде (2) в конце второго имени файла или полностью изменить имя файла.

+1

Когда я загрузки, я присвоить файлу имя хэша ... на основе имени пользователя и идентификатор человека, который загрузил его. .. и исходное имя файла .... Я объединяю m вместе, тогда назовите класс Hash :: make() на этом ... таким образом вы получите супер уникальное имя файла ... не уверен, что это подойдет вашим целям .... но Im также сохраняет имя в базы данных, с именем access_name, так сказать ... поэтому поиск легко, иначе я мог бы получить получение и организовать файлы, которые будут беспорядочно – KyleK

ответ

3

Первый шаг - проверить, существует ли файл. Если этого не произойдет, извлечь имя файла и расширение с pathinfo(), а затем переименовать его с помощью следующего кода:

$img_name = strtolower(pathinfo($image_name, PATHINFO_FILENAME)); 
$img_ext = strtolower(pathinfo($image_name, PATHINFO_EXTENSION)); 

$filecounter = 1; 

while (file_exists($destinationPath)) { 
    $img_duplicate = $img_name . '_' . ++$filecounter . '.'. $img_ext; 
    $destinationPath = $destinationPath . $img_duplicate; 
} 

Цикл будет продолжать переименовывать файлы как file_1, file_2 и т.д. до тех пор, как условие file_exists($destinationPath) возвращает истинное.

+0

. Просто мое плохое мышление привело меня к мысли, что я должен что-то делать с объектом '$ file'. Я пропустил, что я назвал файл в '$ file-> move()' последним. спасибо –

+0

Ах, рад, что вы это поняли. Удачи! :) –

1

Я знаю, что этот вопрос закрыт, но это способ проверить, если имя файла уже занято, так что исходный файл не перезаписаны:

(... в контроллере: ...)

$path = public_path().'\\uploads\\'; 
$extension = pathinfo($fileName, PATHINFO_EXTENSION); 
$original_filename = pathinfo($fileName, PATHINFO_FILENAME); 
$new_filename = $this->getNewFileName($original_filename, $extension, $path); 
$upload_success = Input::file('file')->move($path, $new_filename); 

эта функция получит «неиспользуемый» имя файла:

public function getNewFileName($filename, $extension, $path){ 
    $i = 1; 
    $new_filename = $filename.'.'.$extension; 
    while(File::exists($path.$new_filename)) 
     $new_filename = $filename.' ('.$i++.').'.$extension; 
    return $new_filename; 
} 
+0

Это близко, но вам нужно отключить '$ filename' в нескольких местах для' $ original_filename' в вашей функции 'getNewFileName'. – Dan

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