图库API开发:如何为复制的图片名称自动添加递增序号后缀
自动添加拷贝图片递增序号实现方案
核心实现逻辑
- 拆分原始文件名:通过正则提取基础名称和已有的序号,避免出现
image(1)(1)这类嵌套序号的问题 - 统计同基础名的拷贝数量:查询数据库中所有符合「基础名(数字)」格式的图片记录,取最大序号加1作为新拷贝的序号
- 拼接生成新文件名:按照要求的格式拼接基础名和新序号
修改后的完整代码
'use strict' let imageObject= require('../models/image-object'); let fs=require('fs'); let path= require('path'); let gallery_controllers={ copyImage:function(req,res){ // 获取待复制图片的ID参数 let imageId=req.params.id; if(imageId==null) return res.status(404).send({message:"未定义ID"}); // 从数据库查询待复制的图片记录 imageObject.findById(imageId,(err,image)=>{ if(err) return res.status(500).send({message:'数据请求失败'}); if(!image) return res.status(404).send({message:'未找到对应图片'}); if(image){ // 1. 拆分原始文件名,提取基础名和已有序号 const nameReg = /^(.*?)(?:\((\d+)\))?$/ const matchResult = image.name.match(nameReg) const baseName = matchResult[1].trim() // 2. 查询所有同基础名的拷贝图片,计算最大序号 imageObject.find({ name: new RegExp(`^${baseName}\\(\\d+\\)$`) }, (err, sameNameImages) => { if(err) return res.status(500).send({message:'查询同名图片失败'}); let maxNum = 0 sameNameImages.forEach(img => { const num = parseInt(img.name.match(/\((\d+)\)$/)[1]) if (num > maxNum) maxNum = num }) const newNum = maxNum + 1 const newName = `${baseName}(${newNum})` // 3. 初始化拷贝对象,赋值新名称 let imageCopied= new imageObject(); imageCopied.name = newName; imageCopied.image = image.image; // 保存拷贝后的图片到数据库 imageCopied.save((err,image_copied)=>{ if(err) return res.status(500).send({message:"服务器错误"}); if(!image_copied) return res.status(404).send({message:"资源不存在"}); return res.status(200).send({ image:image_copied }) }) }) } }) }, }
可选优化(兼容带后缀的文件名)
如果你的图片名称带有后缀(比如image.jpg),只需要把拆分文件名的正则修改为以下格式即可,会自动保留后缀:
const nameReg = /^(.*?)(?:\((\d+)\))?(\.[^.]+)?$/ const matchResult = image.name.match(nameReg) const baseName = matchResult[1].trim() const suffix = matchResult[3] || '' // 拼接新名称时加上后缀 const newName = `${baseName}(${newNum})${suffix}`
内容的提问来源于stack exchange,提问作者jorge_zerpa
相关产品推荐
相关产品推荐

