前言
使用ElementUI已经有一段时间了,在一边上手开发后台管理系统的同事,也记录了一些笔记,一直都没有时间将这些零零散散的笔记总结起来,整理成一个比较系统详细一点的教程,可以留着以后来看.
关于开发过程中,确实使用到很大一部分的文档,都说前端开发离不开文档,重要的话说三遍,一定要多看文档。
Vue+ElementUI 搭建后台管理系统(实战系列七)-上传图片的功能
Upload 上传:https://element.eleme.io/#/zh-CN/component/upload
在vue后台管理系统里面,有时候会遇到一个图片上传的功能,做这个功能的时候的思路是这样的:
1:首选由前端写一个图片上传的upload标签,选择本地的图片文件之后
2:调用后端给的接口,以二进制文件的形式传给后端服务器
3:服务器进行处理,处理完成之后将服务器的主机名加到图片名称的前缀上
4:返回一个有服务器主机+图片名称的在线就可以访问的链接给到前端
5:前端直接将在线链接路径渲染在界面显示图片
在vue-element-admin里面的具体的实践
1:在store/modules里面新建一个api.js
将上传图片至服务器的后端小伙伴给的接口写在这个js里面
const baseUrl = 'http://39.xx.xxx.1xx/yyexploreplatform' const state = { fileUpload: baseUrl + '/upload/file' } export default { state }
2:打开store/getters.js
getters.js
const getters = { fileUpload: state => state.api.fileUpload, } export default getters
3:新建一个index.vue页面
开始写代码:
<template> <div class="app-container"> <el-form ref="nextProjectForm" :model="nextProjectForm" label-width="100px"> <el-form-item label="插入图片"> <el-upload class="avatar-uploader" :action="fileUpload" :headers="{ Authorization: token }" :show-file-list="false" :on-success="handleAvatarSuccess"> <img v-if="nextProjectForm.publicWelfareUrl" :src="nextProjectForm.publicWelfareUrl" class="avatar"/> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </el-form-item> </el-form> </div> </template> <script> import { mapGetters } from "vuex"; export default { data() { return { nextProjectForm: { publicWelfareUrl: "", }, }; }, computed: { ...mapGetters(["fileUpload", "token"]) }, methods: { handleAvatarSuccess(response, file, fileList) { if (response && response.data && response.data.url) { this.$set(this.nextProjectForm, "publicWelfareUrl", response.data.url); } }, } }; </script> <style lang='scss'> .avatar-uploader .el-upload { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; position: relative; overflow: hidden; } .avatar-uploader .el-upload:hover { border-color: #409eff; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 178px; height: 178px; line-height: 178px; text-align: center; } .avatar { width: 178px; height: 178px; display: block; } </style>
4:效果如下:
5:有些业务需求是这样的,给定一个图片尺寸,比如说最大宽度是500,最大高度是300,如果上传的图片尺寸超过这个范围,在上传的时候,一个提示,不符合这个尺寸的都无法上传。
这个时候,就需要进行判断了
需要在upload里面添加一个:before-upload方法
使用 before-upload 限制用户上传的图片格式和大小。
然后在 methods里面写一下这个方法的实现过程代码
//对图片大小的限制 handleImagesUrlBefore:function(file){ var _this = this; return new Promise(function(resolve, reject) { var reader = new FileReader(); reader.onload = function(event) { var image = new Image(); image.onload = function () { var width = this.width; var height = this.height; if (width>500 ){ _this.$alert('图片宽度尺寸必须在500之内!', '提示', {confirmButtonText: '确定'}); reject(); } if (height >300) { _this.$alert('图片高度尺寸必须在300之内!', '提示', {confirmButtonText: '确定'}); reject(); } resolve(); }; image.src = event.target.result; } reader.readAsDataURL(file); }); },
完整的参考代码:
<template> <div class="app-container"> <el-form ref="nextProjectForm" :model="nextProjectForm" label-width="100px"> <el-form-item label="插入图片"> <el-upload class="avatar-uploader" :action="fileUpload" :before-upload="handleImagesUrlBefore" :headers="{ Authorization: token }" :show-file-list="false" :on-success="handleAvatarSuccess"> <img v-if="nextProjectForm.publicWelfareUrl" :src="nextProjectForm.publicWelfareUrl" class="avatar"/> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </el-form-item> </el-form> </div> </template> <script> import { mapGetters } from "vuex"; export default { data() { return { nextProjectForm: { publicWelfareUrl: "", }, }; }, computed: { ...mapGetters(["fileUpload", "token"]) }, methods: { //对图片大小的限制 handleImagesUrlBefore:function(file){ var _this = this; return new Promise(function(resolve, reject) { var reader = new FileReader(); reader.onload = function(event) { var image = new Image(); image.onload = function () { var width = this.width; var height = this.height; if (width>500 ){ _this.$alert('图片宽度尺寸必须在500之内!', '提示', {confirmButtonText: '确定'}); reject(); } if (height >300) { _this.$alert('图片高度尺寸必须在300之内!', '提示', {confirmButtonText: '确定'}); reject(); } resolve(); }; image.src = event.target.result; } reader.readAsDataURL(file); }); }, handleAvatarSuccess(response, file, fileList) { if (response && response.data && response.data.url) { this.$set(this.nextProjectForm, "publicWelfareUrl", response.data.url); } }, } }; </script> <style lang='scss'> .avatar-uploader .el-upload { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; position: relative; overflow: hidden; } .avatar-uploader .el-upload:hover { border-color: #409eff; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 178px; height: 178px; line-height: 178px; text-align: center; } .avatar { width: 178px; height: 178px; display: block; } </style>
如果不符合尺寸的时候,会有一个弹框进行提示。