vue上传图片,组件用element-ui上传组件
<el-upload class="avatar-uploader" action="https://jsonplaceholder.typicode.com/posts/" :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>
其中:action 采用绑定的形式,表示上传的接口地址,api :配置跨域时的接口
:action = "/api/+'upload'"
axios.defaults.baseURL = '/api';
on-success 上传成功之后。。。
before-upload 上传之前。。。,比如验证,大小,尺寸
上传接口配置完成后,上传一张图片,可以看到有一个请求,查看请求地址,无问题
看到有一个数据Form Data,已经把图片转成了二进制数据,把数据传到服务器了,接下来写服务器
// 获取上传文件,但 express 本身没有能力获取到上传文件的数据,因此要一个中间件专门用来获取上传文件 npm i multer const express = require('express'); const path = require('path'); const multer= require('multer'); // 上传中间件,dest:目标地址 __dirname:当前文件所在文件夹,绝对地址,将来上传的图片二进制文件保存在此处 const upload = multer({dest:__dirname + '/../../Public/uploadAvatars'}); // const user = require('../../models/Users/user'); const UploadAvatar = express.Router(); //file 就是前段上传图片的 Form Data // express 本身没有req.file,加了中间件,把数据赋值到req上,才有了req.file UploadAvatar.post('/upload',upload.single('file'),async (req,res) => { const file = req.file; res.send(file) }); module.exports = UploadAvatar;
服务器写好,上传图片,可以看到有图片信息在里边,包括路径,大小,filename等
再看服务器,已经有一个图片二进制文件了,就是刚上传的图片
接下来,就是把这张图片以URL的形式返回给客户端
首先,存放在服务器的二进制文件要能被访问到,所有要开放出来
// 开放静态文件 app.use('/Public',express.static(__dirname + '/Public'));
然后在服务器端,还是上面的接口里,但这次多了一个自己拼出来的URL,通过URL客户端就可以访问到图片
UploadAvatar.post('/upload',upload.single('file'),async (req,res) => { const file = req.file; file.url = `http://localhost:3000/uploads/${file.filename}`; res.send(file) });
可以看到,数据里多了一个URL
前端,将URL赋值给 组件中的imageUrl
afterUpload(res){ this.imageUrl = res.url }