图片上传详情

在实际的生产中我们经常需要上传头像等文件的操作,这时候我们可以选择使用 multer 这个中间件来
解决这个问题,下面用上传头像的常见业务来解释 multer 中间件的用法。

技术选型

将图片存入数据库有两种方法:
1. 将图片进行 base64 转码,再保存到数据库(数据库搬家容易,比较安全,但数据库空间的消耗
大,访问会比较缓慢)
2. 利用 multer 库将图片上传到服务器,把图片链接保存到数据库
第一个方案是最好实现的,只需要将图片进行 base64 转码,再保存到数据库就可以了。但是有个问
题,就是如果图片较大,就相当于把几百 kb 的数据保存到了数据库中,这明显不合理 😷
所以本次打算采用第二种方式来实现。

项目初始化

1. 安装依赖
首先创建一个 express-multer-upload 工程项目,然后使用 npm i express 等命令在项目中下好各种依赖
包,
下面是我下载的依赖以及版本。
2. 项目结构划分
本着以比较规范的形式去完成这个项目,所以有必要进行合理的项目结构划分。如下:
由于本次不涉及数据库操作,所以省略了数据库访问层

开启服务,测试接口

1. 开启服务
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 命令开启服务,可以看到服务已经跑起来了:
2. 测试接口
可以看到成功的拿到了请求响应的数据

multer上传逻辑

1. multer 配置
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({
destination: 'public',
filename (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: 2 * 1024 * 1024 } // 2M
})
module.exports = multerConfig
在该配置中可以设置文件保存的地址、文件名称、限制上传的文件格式、文件大小
2. upload 上传逻辑
multer 目录下创建 upload.js ,编写如下代码:
// 引入配置好的 multerConfig
const multerConfig = require('./multerConfig')
const express = require('express')
const multer = require('multer')
const app = express()
const multerConfig = multer({
storage: multer.diskStorage({
destination: 'public',
filename (req, file, cb) {
// 将图片名称分割伪数组,用于截取图片的后缀
const fileFormat = file.originalname.split('.')
// 自定义图片名称
cb(null, Date.now() + '.' + fileFormat[fileFormat.length - 1])
}
}),
limits: {
fileSize: 2 * 1024 * 1024
}
})
app.post('/upload', multerConfig.single('file'), (req, res) => {
const { filename } = req.file
res.send({
code: 0,
msg: '上传成功!',
data: 'http://127.0.0.1:3001'+filename
})
})
// 启动应用程序并监听端口号3001
app.listen(3001, () => {
console.log('应用程序已启动,监听端口号3000')
})
注意:上面的 multerConfig.single('file') 表示单文件上传,并且字段名为 “file” ,后面上传图片的字段必
须保持一致

上传图片,图片链接测试

1. 上传图片
接下来进入测试环节,依旧是借助 postman 工具进行测试
可以看到,成功的拿到了响应的数据,里面也包含了图片的链接地址
注意点:
表单必须是 form-data 格式
文件的字段必须与后端保持一致
2. 图片链接测试
接下来直接把图片的链接地址在浏览器中打开,看能否查看到图片
显然,这样是看不到图片的,因为我们还没开启静态服务的访问,下面来看看怎么开启吧

开启静态资源服务

由于使用了 express 框架,所以开启静态资源服务非常简单,只需要在 app.js 中添加一行代码即可,如 下所示:
app.use(express.static('public'))

然后再打开图片地址,就可以成功访问上传到服务器内的图片了!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值