图片上传流程:
1.创建七牛云存储空间
2.后台创建token
3.前端携带从后台获取的token上传图片到七牛云,成功后将返回src保存到数据库.

一、七牛云存储空间的创建需要先注册账号通过验证即可,创建好之后可以得到一对密钥

在文件管理页面得到一个外链地址

密钥是服务端用于生成token用的,外链用于前端。

二、后台创建token

这里使用的nodejs的koa框架,封装成一个接口getToken.js,在路由中使用它,当然要先安装七牛 npm install qiniu

服务端代码:

const router = require('koa-router')()const qiniu = require('qiniu')const accessKey = "xxx" //     前面得到的密钥const secretKey = "xxx"const bucket = "xxx" //空间名router.get('/', async (ctx) => {  let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);  let options = {      scope: bucket,      expires: 3600 * 2 //token过期时间2小时  };  let putPolicy = new qiniu.rs.PutPolicy(options);  let uploadToken = putPolicy.uploadToken(mac);  if (uploadToken) {      ctx.body = uploadToken  } else {      ctx.body = 'err'  }  })module.exports=router

前端代码也封装成了一个组件,因为需要新建和修改都使用同一个父组件,所以当不是新建时,父组件要传值给子组件,注意不要将props传值直接赋值给src属性,因为重传需要重新赋值,直接改props传值会有警告。

前端代码,uploadimage.js:

<template>  <div class="upload">    <el-upload class="avatar-uploader"       :action="upload"       :data="qiniuData"      :show-file-list="false"       :headers="getAuthHeaders()"       :before-upload="beforeUpload"      :on-success="handleSuccess">      <img v-if="icon" :src="icon ? icon : imgUrl" class="avatar">      <i v-else class="el-icon-plus avatar-uploader-icon"></i>    </el-upload>  </div></template><script>export default {  props:{    icon:{type:String}  },  data() {    return {      imageUrl:'',  //传给后台的src      upload:'https://upload-z1.qiniup.com', //七牛云的上传地址(华北)      qiniuData:{        key:'', //图片名字处理        token:''      },      qiniuAddr:'http://xxx.clouddn.com' //七牛云的图片外链地址    };  },  mounted(){    this.getQiniuToken()  },  methods: {    handleSuccess(res) {      this.imageUrl = `${this.qiniuAddr}/${res.key}`;      this.$emit('getFromChild',this.imageUrl)    },    beforeUpload(file) {            const isJPG = file.type === 'image/jpeg';      const isLt2M = file.size / 1024 / 1024 < 2;       if (!isJPG) {         this.$message.error('上传头像图片只能是 JPG 格式!');       } if (!isLt2M) {         this.$message.error('上传头像图片大小不能超过 2MB!');       }      this.qiniuData.key = `upload_pic_${file.name}`      return isJPG && isLt2M;       } ,    async getQiniuToken(){      const res=await this.$http.get('/uploadToken')      this.qiniuData.token = res.data    }  }}</script>

前端代码,父组件部分代码:

<el-form-item label="图标">   <uploadImage @getFromChild="getValue" :icon="model.icon"></uploadImage></el-form-item>

保存到数据库,另行请求接口这里不涉及。

参考:
七牛SDK官方
elementui