前端:vue+element
<el-form-item label="头像">
<el-upload
class="avatar-uploader"
name="head_img"
action="http://127.0.0.1:3000/api/users/upload"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<img v-if="imageUrl" :src="imageUrl" class="avatar" />
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
<div class="tips">请上传2MB以内的JPG图片,建议1:1比例</div>
</el-form-item>
handleAvatarSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw)
this.imageUrl = res.data
},
后端express
npm install --save multer
const multer = require('multer')
const fs = require('fs')
const path = require('path')
let upload = multer({
storage: multer.diskStorage({
destination: function (req, file, cb) {
let date = new Date()
let year = date.getFullYear()
let month = (date.getMonth() + 1).toString().padStart(2, '0')
let day = date.getDate()
let dir = path.join(__dirname, '../public/uploads/' + year + month + day)
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true })
}
cb(null, dir)
},
filename: function (req, file, cb) {
let fileName = Date.now() + path.extname(file.originalname)
cb(null, fileName)
}
})
})
module.exports =upload
const { upload } = require('../utils/index')
router.post('/upload', upload.single('head_img'), async (req, res, next) => {
let path = req.file.path.split('public')[1]
let imgUrl = 'http://127.0.0.1:3000' + path
res.send({ code: 0, msg: '上传成功', data: imgUrl })
})