Laravel上传图片时给文件名追加自增ID避免重名的实现方案咨询
实现方案
推荐方案:追加当前博客数据的自增主键ID
该方案利用数据库主键全局唯一的特性,无需额外判断文件是否存在,性能更高、不会出现重名问题,只需修改控制器上传逻辑即可,模型原有方法不需要调整:
// 先保存博客基础数据,获取生成的自增主键ID $blog->save(); if ($request->hasFile('image')) { $file = $request->file('image'); // 拆分原文件名的名称和后缀 $originalName = $file->getClientOriginalName(); $nameInfo = pathinfo($originalName); // 拼接新文件名:原名称 + 自增ID + 后缀 $newFilename = $nameInfo['filename'] . $blog->id . '.' . $nameInfo['extension']; $blog->image = $file->storeAs('public/images', $newFilename); // 二次保存更新图片字段 $blog->save(); }
可选方案:同原始文件名按序号递增
如果你的需求是只有相同原始文件名的文件才需要按1、2、3的序号追加,不同名称的文件序号可以重复,可以用以下方案:
if ($request->hasFile('image')) { $file = $request->file('image'); $publicDisk = Storage::disk('public'); $originalName = $file->getClientOriginalName(); $nameInfo = pathinfo($originalName); $index = 1; // 循环查找当前目录下不存在的文件名 do { $newFilename = $nameInfo['filename'] . $index . '.' . $nameInfo['extension']; $checkPath = 'images/' . $newFilename; $index++; } while ($publicDisk->exists($checkPath)); $blog->image = $file->storeAs('public/images', $newFilename); }
注意事项
- 两种方案都完全兼容你现有模型中的
getOriginImageUrl、getImageAttribute方法,不需要做任何修改 - 若需要避免原文件名中的特殊字符导致路径异常,可以在拼接文件名前对原文件名做过滤,比如用
preg_replace('/[^A-Za-z0-9_\-\x{4e00}-\x{9fa5}]/u', '', $nameInfo['filename'])保留中英文、数字、下划线和横杠
内容的提问来源于stack exchange,提问作者user12869095
相关产品推荐
相关产品推荐

