文章目录
- 大家好,我是CoderBin,最近在做一个Vue项目,其中涉及到了头像图片上传。由于之前没做过图片上传功能,所以在实现这个功能时着实遇到了不少坑。本次打算将实现过程以博文的形式分享给大家。
实现过程将以项目驱动的方式,手把手带各位实现一个后端上传图片功能,希望对大家有所帮助, 感谢大家的留言点赞收藏
项目涉及内容:express本地服务、路由、接口封装、静态资源服务、multer配置、图片上传流程、结构化项目、path模块使用、fs模块使用、postman测试
如果文中有不对、疑惑或者错字的地方,欢迎在评论区留言指正
-
- 本项目后端采用 Node.js + Express + Multer 等技术实现
- 在经过一番探索后,总结了一下三种方式可实现图片上传: 将图片进行 base64 转码,再保存到数据库 利用 multer 库将图片上传到服务器,把图片链接保存到数据库 上传到对象存储OSS服务上
- 第一个方案是最好实现的,只需要将图片进行 base64 转码,再保存到数据库就可以了。但是有个问题,就是如果图片较大,就相当于把几百kb的数据保存到了数据库中,这明显不合理(第一次就使用了这个方案) 第三个方案将上传到对象存储OSS服务上,这个是现在常用的上传方案。但我了解不多,相关文章不是很详细,打算后面再去了解一下。 所以经过考虑,本次打算采用第二种方式来实现。
-
- 在 app.js 中编写如下代码: const express = require('express') const bodyParser = require('body-parser') const cors = require('cors') // 创建 app 实例 const app = express() // 开启跨域支持 app.use(cors()) // 解析表单 app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true })) // * 简单测试接口,后面会删掉 app.get('/', (req, res) => { res.send('ok') }) // 开启监听服务 app.listen('3001', () => { console.log('express serve running at http://localhost:3001'); }) 在终端输入 nodemon app.js 命令开启服务,可以看到服务已经跑起来了: 注意:没有安装 nodemon 也可以使用 node app.js 命令
- 使用 postman 测试工具进行接口测试 可以看到成功的拿到了请求响应的数据
-
- 在 multer 目录下创建 multerConfig.js,编写如下代码: 引入依赖 封装处理路径函数 设置 multer 的配置对象 为 multer 添加配置 // 1. 引入依赖 const multer = require('multer') const path = require('path') // 2. 封装处理路径函数 const handlePath = (dir) => { return path.join(__dirname, './', dir) } // 3. 设置 multer 的配置对象 const storage = multer.diskStorage({ // 3.1 存储路径 destination: function(req, file, cb) { if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype==='image/gif') { cb(null, handlePath('../../public')) } else { cb({ error: '仅支持 jpg/png/gif 格式的图片!' }) } }, // 3.2 存储名称 filename: function (req, file, cb) { // 将图片名称分割伪数组,用于截取图片的后缀 const fileFormat = file.originalname.split('.') // 自定义图片名称 cb(null, Date.now() + '.' + fileFormat[fileFormat.length - 1]) } }) // 4. 为 multer 添加配置 const multerConfig = multer({ storage: storage, limits: { fileSize: 2097152 } // 2M }) module.exports = multerConfig 在该配置中可以设置文件保存的地址、文件名称、限制上传的文件格式、文件大小
- 在 multer 目录下创建 upload.js,编写如下代码: // 引入配置好的 multerConfig const multerConfig = require('./multerConfig') // 上传到服务器地址 const BaseURL = 'http://localhost:3001' // 上传到服务器的目录 const imgPath = '/public/' // 封装上传图片的接口 function uploadAvatar(req, res) { return new Promise((resolve, reject) => { multerConfig.single('file')(req, res, function (err) { if (err) { // 传递的图片格式错误或者超出文件限制大小,就会reject出去 reject(err) } else { // 拼接成完整的服务器静态资源图片路径 resolve(BaseURL + imgPath + req.file.filename) } }) }) } module.exports = uploadAvatar 上述代码主要是封装了一个上传文件的方法,当图片上传成功时就将拼接好的图片链接 resolve 出去。该方法会在控制器中被调用。 注意:上面的 multerConfig.single('file') 表示单文件上传,并且字段名为 "file",后面上传图片的字段必须保持一致
-
- 在 controllers 目录下创建 UserController.js,编写如下代码: const uploadAvatar = require('../multer/upload') // 用户的逻辑控制器 class UserController { // 头像图片上传 async upload(req, res) { try { const uploadRes = await uploadAvatar(req, res) res.send({ meta: { code: 200, msg: '上传成功!' }, data: { img_url: uploadRes} }) } catch (error) { res.send(error) } } } module.exports = new UserController() 上述代码主要是编写了一个用户控制器类 UserController,以及一个图片上传的方法 upload。 在 upload 中调用了上传图片的接口 uploadAvatar,得到成功或失败的结果,在响应给客户端。
- 在 routers 目录下创建 index.js,编写如下代码: const express = require('express') // 导入用户逻辑 const userController = require('../controllers/UserController') // 创建路由对象 const router = express.Router() // 设置路由 router.post('/upload/avatar', userController.upload) // 导入路由对象 module.exports = router 定义了路由之后还需要在 app.js 中注册路由,添加如下代码: // 导入定义的路由 const router = require('./src/routers/index') // 注册路由 app.use('/user', router) 在 app.js 中,增加上面两行代码即可完成路由注册
- 由于使用了 express 框架,所以开启静态资源服务非常简单,只需要在 app.js 中添加一行代码即可,如下所示: app.use('/public/', express.static('./public/')) 然后再打开图片地址,就可以成功访问上传到服务器内的图片了!
- 由于这是一个用户上传头像图片的功能,当用户第二次上传头像时,需要将原先的图片删除掉,否则旧的图片会一直保存在服务器中。 一开始的想法是使用用户id作为图片名称,这样每一次上传图片,都会把原来的图片覆盖掉。但是这样会有两个问题 不同格式的图片会残留(jpg、png、gif),不会被覆盖掉 如果可以覆盖,但是图片链接地址不会有变化,存入数据库时也是跟上一次的图片地址是相同的,这样会导致前端页面不会根据静态资源中头像图片变化而变化 所以这里采用的做法是先对图片的名称进行拼接优化,改为如下的形式: 时间戳.用户id.jpg 这样既能保证每一张图片都不重复,而且还附带了用户的id 注:可以使用 md5 对时间戳进行加密,以确保唯一性。这里为了方便就直接使用时间戳。
- 这个过程其实就是删除旧图片,重命名新图片为规定的格式,可以编写一个函数来实现。
- 查找指定路径下的所有图片文件,进行遍历 先查询该id命名的文件是否存在,存在则删除 根据新存入的文件名(时间戳.jpg),找到对应文件,然后重命名为: 时间戳.id.jpg 在upload.js,编写如下代码: const fs = require('fs') // 对图片进行去重删除和重命名 const hanldeImgDelAndRename = (id, filename, dirPath) => { // TODO 查找该路径下的所有图片文件 fs.readdir(dirPath, (err, files) => { for (let i in files) { // 当前图片的名称 const currentImgName = path.basename(files[i]) // 图片的名称数组:[时间戳, id, 后缀] const imgNameArr = currentImgName.split('.') // TODO 先查询该id命名的文件是否存在,有则删除 if (imgNameArr[1] === id) { const currentImgPath = dirPath + '/' + currentImgName fs.unlink(currentImgPath, (err) => { }) } // TODO 根据新存入的文件名(时间戳.jpg),找到对应文件,然后重命名为: 时间戳.id.jpg if (currentImgName === filename) { const old_path = dirPath + '/' + currentImgName const new_path = dirPath + '/' + imgNameArr[0] + '.' + id + path.extname(files[i]) // 重命名该文件 fs.rename(old_path, new_path, (err) => { }) } } }) } 函数执行过程分析: 该函数主要调用了 fs 内置模块中的 readdir 进行指定路径查询文件,再进行遍历 将图片名称分割为数组,取出id与传入的id进行判断,符合条件则调用 fs 内置模块中的 fs.unlink() 方法删除文件 根据新存入的文件名(时间戳.jpg),找到对应文件,然后重命名为: 时间戳.id.jpg。然后调用 fs 内置模块中的 fs.rename() 方法重命名文件
- 完成图片去重删除和重命名 hanldeImgDelAndRename 方法后,还需要在 upload.js 中原先的上传接口方法 uploadAvatar 中进行调用,修改为如下代码: const path = require('path') // 封装处理路径函数 const handlePath = (dir) => { return path.join(__dirname, './', dir) } // 上传接口的 请求参数req 响应参数res function uploadAvatar(req, res) { return new Promise((resolve, reject) => { multerConfig.single('file')(req, res, function (err) { if (err) { reject(err) } else { // 对图片进行去重删除和重命名 hanldeImgDelAndRename(req.body.id, req.file.filename, handlePath('../../public')) const img = req.file.filename.split('.') resolve({ id: req.body.id, // 重新返回符合规定的图片链接地址 img_url: BaseURL + imgPath + img[0] + '.' + req.body.id + '.' + img[1] }) } }) }) } 注意:在上传文件时,必须携带 id 字段,这样 req.body.id 才能获取到传入的 id。
- 该项目源码已经被我放在了Gitee上,有感兴趣的小伙伴可以自行前往查看: node-express-multer-upload-img 每文一句:书山有路勤为径,学海无涯苦作舟。 本次的分享就到这里,如果本章内容对你有所帮助的话欢迎点赞+收藏。文章有不对的地方欢迎指出,有任何疑问都可以在评论区留言。希望大家都能够有所收获,大家一起探讨、进步!
-
大家好,我是
CoderBin,最近在做一个Vue项目,其中涉及到了头像图片上传。由于之前没做过图片上传功能,所以在实现这个功能时着实遇到了不少坑。本次打算将实现过程以博文的形式分享给大家。,实现过程将以
项目驱动的方式,手把手带各位实现一个后端上传图片功能,希望对大家有所帮助, 感谢大家的留言点赞收藏 ,项目涉及内容:express本地服务、路由、接口封装、静态资源服务、multer配置、图片上传流程、结构化项目、path模块使用、fs模块使用、postman测试,如果文中有不对、疑惑或者错字的地方,欢迎在评论区留言指正,本项目后端采用 Node.js + Express + Multer 等技术实现,在经过一番探索后,总结了一下三种方式可实现图片上传:,第一个方案是最好实现的,只需要将图片进行 base64 转码,再保存到数据库就可以了。但是有个问题,就是如果图片较大,就相当于把几百kb的数据保存到了数据库中,这明显不合理(第一次就使用了这个方案),第三个方案将上传到对象存储OSS服务上,这个是现在常用的上传方案。但我了解不多,相关文章不是很详细,打算后面再去了解一下。,所以经过考虑,本次打算采用第二种方式来实现。,首先创建一个
express-multer-upload工程项目,然后使用
npm i express 等命令在项目中下好各种依赖包,,下面是我下载的依赖以及版本。,
,本着以比较规范的形式去完成这个项目,所以有必要进行合理的项目结构划分。如下:,
,由于本次不涉及数据库操作,所以省略了
数据库访问层,在 app.js 中编写如下代码:,在终端输入
nodemon app.js 命令开启服务,可以看到服务已经跑起来了:,
注意:没有安装 nodemon 也可以使用
node app.js 命令,使用 postman 测试工具进行接口测试,
可以看到成功的拿到了请求响应的数据,在 multer 目录下创建
multerConfig.js,编写如下代码:,在该配置中可以设置文件保存的地址、文件名称、限制上传的文件格式、文件大小,在 multer 目录下创建
upload.js,编写如下代码:,上述代码主要是封装了一个上传文件的方法,当图片上传成功时就将拼接好的图片链接
resolve 出去。该方法会在控制器中被调用。,注意:上面的
multerConfig.single('file') 表示单文件上传,并且字段名为 "file",后面上传图片的字段必须保持一致,在 controllers 目录下创建
UserController.js,编写如下代码:,上述代码主要是编写了一个用户控制器类
UserController,以及一个图片上传的方法
upload。,在
upload 中调用了上传图片的接口
uploadAvatar,得到成功或失败的结果,在响应给客户端。,在 app.js 中,增加上面两行代码即可完成路由注册,接下来进入测试环节,依旧是借助 postman 工具进行测试,
,可以看到,成功的拿到了响应的数据,里面也包含了图片的链接地址,注意点:,接下来直接把图片的链接地址在浏览器中打开,看能否查看到图片,
显然,这样是看不到图片的,因为我们还没开启静态服务的访问,下面来看看怎么开启吧,由于使用了 express 框架,所以开启静态资源服务非常简单,只需要在
app.js 中添加一行代码即可,如下所示:,然后再打开图片地址,就可以成功访问上传到服务器内的图片了!,
,由于这是一个用户上传头像图片的功能,当用户第二次上传头像时,需要将原先的图片删除掉,否则旧的图片会一直保存在服务器中。,一开始的想法是使用用户id作为图片名称,这样每一次上传图片,都会把原来的图片覆盖掉。但是这样会有两个问题,所以这里采用的做法是先对图片的名称进行拼接优化,改为如下的形式:,这样既能保证每一张图片都不重复,而且还附带了用户的id,注:可以使用 md5 对时间戳进行加密,以确保唯一性。这里为了方便就直接使用时间戳。,这个过程其实就是删除旧图片,重命名新图片为规定的格式,可以编写一个函数来实现。,在
upload.js,编写如下代码:,函数执行过程分析:,完成图片去重删除和重命名
hanldeImgDelAndRename 方法后,还需要在
upload.js 中原先的上传接口方法
uploadAvatar 中进行调用,修改为如下代码:,注意:在上传文件时,必须携带 id 字段,这样
req.body.id 才能获取到传入的 id。,
,可以看到,图片上传成功,并且图片的名称也是按照我们的规定进行拼接,后端服务器也成功保存了上传的图片。,
,
,第二次上传,成功的将相同 id 的旧图片进行了删除,并且重命名了图片名称。,这里还可以上传不同 id 以表示不同用户上传头像来进行测试,如下:,
,可以看到,不同 id 之间上传的图片是互不干扰的,只有当 id 匹配时才会进行替换和重命名。,最后只需要在控制器当中,把获取到的图片链接地址保存到数据库即可,这里可以根据用户 id 进行保存。,到此为止,这个Node+Express+Multer实现图片上传的功能就完成啦~,该项目源码已经被我放在了Gitee上,有感兴趣的小伙伴可以自行前往查看:,node-express-multer-upload-img,本次的分享就到这里,如果本章内容对你有所帮助的话欢迎
点赞+收藏。文章有不对的地方欢迎指出,有任何疑问都可以在评论区留言。希望大家都能够有所收获,大家一起探讨、进步!,在终端输入
nodemon app.js 命令开启服务,可以看到服务已经跑起来了:,将图片进行 base64 转码,再保存到数据库,利用 multer 库将图片上传到服务器,把图片链接保存到数据库,
大家好,我是CoderBin,最近在做一个Vue项目,其中涉及到了头像图片上传。由于之前没做过图片上传功能,所以在实现这个功能时着实遇到了不少坑。本次打算将实现过程以博文的形式分享给大家。
实现过程将以项目驱动的方式,手把手带各位实现一个后端上传图片功能,希望对大家有所帮助, 感谢大家的留言点赞收藏
项目涉及内容:express本地服务、路由、接口封装、静态资源服务、multer配置、图片上传流程、结构化项目、path模块使用、fs模块使用、postman测试
如果文中有不对、疑惑或者错字的地方,欢迎在评论区留言指正
本项目后端采用 Node.js + Express + Multer 等技术实现
在经过一番探索后,总结了一下三种方式可实现图片上传:
- 将图片进行 base64 转码,再保存到数据库
- 利用 multer 库将图片上传到服务器,把图片链接保存到数据库
- 上传到对象存储OSS服务上
第一个方案是最好实现的,只需要将图片进行 base64 转码,再保存到数据库就可以了。但是有个问题,就是如果图片较大,就相当于把几百kb的数据保存到了数据库中,这明显不合理(第一次就使用了这个方案)
第三个方案将上传到对象存储OSS服务上,这个是现在常用的上传方案。但我了解不多,相关文章不是很详细,打算后面再去了解一下。
所以经过考虑,本次打算采用第二种方式来实现。
首先创建一个express-multer-upload工程项目,然后使用 npm i express 等命令在项目中下好各种依赖包,
下面是我下载的依赖以及版本。

本着以比较规范的形式去完成这个项目,所以有必要进行合理的项目结构划分。如下:

由于本次不涉及数据库操作,所以省略了数据库访问层
在 app.js 中编写如下代码:
const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
// 创建 app 实例
const app = express()
// 开启跨域支持
app.use(cors())
// 解析表单
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
// * 简单测试接口,后面会删掉
app.get('/', (req, res) => {
res.send('ok')
})
// 开启监听服务
app.listen('3001', () => {
console.log('express serve running at http://localhost:3001');
})
在终端输入 nodemon app.js 命令开启服务,可以看到服务已经跑起来了:
注意:没有安装 nodemon 也可以使用 node app.js 命令
使用 postman 测试工具进行接口测试
可以看到成功的拿到了请求响应的数据
在 multer 目录下创建 multerConfig.js,编写如下代码:
- 引入依赖
- 封装处理路径函数
- 设置 multer 的配置对象
- 为 multer 添加配置
// 1. 引入依赖
const multer = require('multer')
const path = require('path')
// 2. 封装处理路径函数
const handlePath = (dir) => {
return path.join(__dirname, './', dir)
}
// 3. 设置 multer 的配置对象
const storage = multer.diskStorage({
// 3.1 存储路径
destination: function(req, file, cb) {
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype==='image/gif') {
cb(null, handlePath('../../public'))
} else {
cb({ error: '仅支持 jpg/png/gif 格式的图片!' })
}
},
// 3.2 存储名称
filename: function (req, file, cb) {
// 将图片名称分割伪数组,用于截取图片的后缀
const fileFormat = file.originalname.split('.')
// 自定义图片名称
cb(null, Date.now() + '.' + fileFormat[fileFormat.length - 1])
}
})
// 4. 为 multer 添加配置
const multerConfig = multer({
storage: storage,
limits: { fileSize: 2097152 } // 2M
})
module.exports = multerConfig
在该配置中可以设置文件保存的地址、文件名称、限制上传的文件格式、文件大小
在 multer 目录下创建 upload.js,编写如下代码:
// 引入配置好的 multerConfig
const multerConfig = require('./multerConfig')
// 上传到服务器地址
const BaseURL = 'http://localhost:3001'
// 上传到服务器的目录
const imgPath = '/public/'
// 封装上传图片的接口
function uploadAvatar(req, res) {
return new Promise((resolve, reject) => {
multerConfig.single('file')(req, res, function (err) {
if (err) {
// 传递的图片格式错误或者超出文件限制大小,就会reject出去
reject(err)
} else {
// 拼接成完整的服务器静态资源图片路径
resolve(BaseURL + imgPath + req.file.filename)
}
})
})
}
module.exports = uploadAvatar
上述代码主要是封装了一个上传文件的方法,当图片上传成功时就将拼接好的图片链接 resolve 出去。该方法会在控制器中被调用。
注意:上面的 multerConfig.single('file') 表示单文件上传,并且字段名为 "file",后面上传图片的字段必须保持一致
在 controllers 目录下创建 UserController.js,编写如下代码:
const uploadAvatar = require('../multer/upload')
// 用户的逻辑控制器
class UserController {
// 头像图片上传
async upload(req, res) {
try {
const uploadRes = await uploadAvatar(req, res)
res.send({
meta: { code: 200, msg: '上传成功!' },
data: { img_url: uploadRes}
})
} catch (error) {
res.send(error)
}
}
}
module.exports = new UserController()
上述代码主要是编写了一个用户控制器类 UserController,以及一个图片上传的方法 upload。
在 upload 中调用了上传图片的接口 uploadAvatar,得到成功或失败的结果,在响应给客户端。
- 在 routers 目录下创建 index.js,编写如下代码:
const express = require('express')
// 导入用户逻辑
const userController = require('../controllers/UserController')
// 创建路由对象
const router = express.Router()
// 设置路由
router.post('/upload/avatar', userController.upload)
// 导入路由对象
module.exports = router
- 定义了路由之后还需要在 app.js 中注册路由,添加如下代码:
// 导入定义的路由
const router = require('./src/routers/index')
// 注册路由
app.use('/user', router)
const express = require('express')
// 导入用户逻辑
const userController = require('../controllers/UserController')
// 创建路由对象
const router = express.Router()
// 设置路由
router.post('/upload/avatar', userController.upload)
// 导入路由对象
module.exports = router
// 导入定义的路由
const router = require('./src/routers/index')
// 注册路由
app.use('/user', router)
在 app.js 中,增加上面两行代码即可完成路由注册
接下来进入测试环节,依旧是借助 postman 工具进行测试

可以看到,成功的拿到了响应的数据,里面也包含了图片的链接地址
注意点:
- 表单必须是 form-data 格式
- 文件的字段必须与后端保持一致
接下来直接把图片的链接地址在浏览器中打开,看能否查看到图片
显然,这样是看不到图片的,因为我们还没开启静态服务的访问,下面来看看怎么开启吧
由于使用了 express 框架,所以开启静态资源服务非常简单,只需要在 app.js 中添加一行代码即可,如下所示:
app.use('/public/', express.static('./public/'))
然后再打开图片地址,就可以成功访问上传到服务器内的图片了!

由于这是一个用户上传头像图片的功能,当用户第二次上传头像时,需要将原先的图片删除掉,否则旧的图片会一直保存在服务器中。
一开始的想法是使用用户id作为图片名称,这样每一次上传图片,都会把原来的图片覆盖掉。但是这样会有两个问题
- 不同格式的图片会残留(jpg、png、gif),不会被覆盖掉
- 如果可以覆盖,但是图片链接地址不会有变化,存入数据库时也是跟上一次的图片地址是相同的,这样会导致前端页面不会根据静态资源中头像图片变化而变化
所以这里采用的做法是先对图片的名称进行拼接优化,改为如下的形式:
时间戳.用户id.jpg
这样既能保证每一张图片都不重复,而且还附带了用户的id
注:可以使用 md5 对时间戳进行加密,以确保唯一性。这里为了方便就直接使用时间戳。
这个过程其实就是删除旧图片,重命名新图片为规定的格式,可以编写一个函数来实现。
- 查找指定路径下的所有图片文件,进行遍历
- 先查询该id命名的文件是否存在,存在则删除
- 根据新存入的文件名(时间戳.jpg),找到对应文件,然后重命名为:
时间戳.id.jpg
时间戳.id.jpg在upload.js,编写如下代码:
const fs = require('fs')
// 对图片进行去重删除和重命名
const hanldeImgDelAndRename = (id, filename, dirPath) => {
// TODO 查找该路径下的所有图片文件
fs.readdir(dirPath, (err, files) => {
for (let i in files) {
// 当前图片的名称
const currentImgName = path.basename(files[i])
// 图片的名称数组:[时间戳, id, 后缀]
const imgNameArr = currentImgName.split('.')
// TODO 先查询该id命名的文件是否存在,有则删除
if (imgNameArr[1] === id) {
const currentImgPath = dirPath + '/' + currentImgName
fs.unlink(currentImgPath, (err) => { })
}
// TODO 根据新存入的文件名(时间戳.jpg),找到对应文件,然后重命名为: 时间戳.id.jpg
if (currentImgName === filename) {
const old_path = dirPath + '/' + currentImgName
const new_path = dirPath + '/' + imgNameArr[0] + '.' + id + path.extname(files[i])
// 重命名该文件
fs.rename(old_path, new_path, (err) => { })
}
}
})
}
函数执行过程分析:
-
该函数主要调用了
fs内置模块中的readdir进行指定路径查询文件,再进行遍历 -
将图片名称分割为数组,取出id与传入的id进行判断,符合条件则调用
fs内置模块中的fs.unlink()方法删除文件 -
根据新存入的文件名(时间戳.jpg),找到对应文件,然后重命名为:
时间戳.id.jpg。然后调用fs内置模块中的fs.rename()方法重命名文件
完成图片去重删除和重命名 hanldeImgDelAndRename 方法后,还需要在 upload.js 中原先的上传接口方法 uploadAvatar 中进行调用,修改为如下代码:
const path = require('path')
// 封装处理路径函数
const handlePath = (dir) => {
return path.join(__dirname, './', dir)
}
// 上传接口的 请求参数req 响应参数res
function uploadAvatar(req, res) {
return new Promise((resolve, reject) => {
multerConfig.single('file')(req, res, function (err) {
if (err) {
reject(err)
} else {
// 对图片进行去重删除和重命名
hanldeImgDelAndRename(req.body.id, req.file.filename, handlePath('../../public'))
const img = req.file.filename.split('.')
resolve({
id: req.body.id,
// 重新返回符合规定的图片链接地址
img_url: BaseURL + imgPath + img[0] + '.' + req.body.id + '.' + img[1]
})
}
})
})
}
注意:在上传文件时,必须携带 id 字段,这样 req.body.id 才能获取到传入的 id。

可以看到,图片上传成功,并且图片的名称也是按照我们的规定进行拼接,后端服务器也成功保存了上传的图片。


第二次上传,成功的将相同 id 的旧图片进行了删除,并且重命名了图片名称。
这里还可以上传不同 id 以表示不同用户上传头像来进行测试,如下:

可以看到,不同 id 之间上传的图片是互不干扰的,只有当 id 匹配时才会进行替换和重命名。
最后只需要在控制器当中,把获取到的图片链接地址保存到数据库即可,这里可以根据用户 id 进行保存。
到此为止,这个Node+Express+Multer实现图片上传的功能就完成啦~
该项目源码已经被我放在了Gitee上,有感兴趣的小伙伴可以自行前往查看:
node-express-multer-upload-img
每文一句:书山有路勤为径,学海无涯苦作舟。
本次的分享就到这里,如果本章内容对你有所帮助的话欢迎点赞+收藏。文章有不对的地方欢迎指出,有任何疑问都可以在评论区留言。希望大家都能够有所收获,大家一起探讨、进步!