在laravel中上传文件名时自动增加文件名

时间:2015-11-22 14:51:47

标签: php laravel-5

我写了一个控制器来将文件上传到目录。并且我想如果一个文件已经存在于该目录中,那么在移动之前,文件名要从上一个相似的现有文件名增加一个单位,如下所示:

test.jpg
test(1).jpg
test(2).jpg

这是我的控制器的主体

$fileName = $file->getClientOriginalName();
$fileExt  = $file->getClientOriginalExtension();

$destinationFolder = public_path('upload/userfiles/');
$num   = 1;

$newName = $fileName;

while (file_exists($destinationFolder . $newName )) {
    $newName = $fileName. '(' . $num . ')';
    $num ++;
}

$file->move($destinationFolder, $newName . '.' . $fileExt);

但这不能正常工作并创建如下文件名:

test.jpg
test(1).jpg
test(1)(2).jpg

3 个答案:

答案 0 :(得分:0)

你的问题是:

$newName = $fileName; 起初是test.jpg 然后你追加($num++),使它成为test(1).jpg

下次还是测试(1).jpg 并附加($num++)然后它变为test(1)(2).jpg

多数民众赞成

答案 1 :(得分:0)

这将有效:

$fileName = $file->getClientOriginalName();
$fileExt  = $file->getClientOriginalExtension();

$destinationFolder = public_path('upload/userfiles/');
$num   = 1;

$newName = $fileName;

$appendNum = false;
while (file_exists($destinationFolder . $newName )) {
    $appendNum = true;
    $num ++;
}
if ($appendNum) $newName = $fileName. '(' . $num . ')';
$file->move($destinationFolder, $newName . '.' . $fileExt);

答案 2 :(得分:0)

这对我有用:

        $current_name   = $file->getClientOriginalName();
        $extension      = $file->getClientOriginalExtension();
        $only_name      = explode('.', $current_name)[0];
        $new_name       = $current_name;

        $destination    = Storage::disk($link_directory)->path($folder);
        $all_files      = Storage::disk($link_directory)->listContents($folder);
        $searchword     = $only_name;
        $matches        = array_filter($all_files, function($var) use ($searchword) { 
            if(strpos($var['filename'], $searchword) !== FALSE) {  
                return $var;
            }
        });

        if( is_array($matches) ){
            $new_name = $only_name. '_' . count($matches).'.'.$extension;
        }

        $filename       = Storage::disk($link_directory)->putFileAs($folder, $file, $new_name);