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