一: 了解整体思路:
步骤一: 封装upload公共组件做文件上传:
基于elementUI的upload组件封装一个通用的上传组件供业务组件使用

1. 创建UploadImg 公共组件(给别人当儿子用) 放在
src/components/UploadImg ,全局组件,看自己需求: 是放在main.js下
面还是Vue.use()下
2. 这是修改过的,完整的去官网上看看吧
<template>
<div>
<!--
show-file-list: 是否显示上传的文件列表
action: '#' 用来指定文件要上传的地址,由于我们需要定制上传动作
这里设为#
:http-request:自定义上传行为(重点)
on-success: 上传成功之后的回调
before-upload: 上传之前的检查
:on-success="handleAvatarSuccess"
-->
<el-upload
class="avatar-uploader"
action="#"
:show-file-list="false"
:before-upload="beforeAvatarUpload"
:http-request="upload"
>
<img v-if="imageUrl" :src="imageUrl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon" />
</el-upload>
</div>
</template>
<script>
export default {
methods:{
// 覆盖默认的上传行为,可以自定义上传的实现
upload(params){
console.log(params)
}
}
}
</script>
效果图:
通过点击或者拖拽上传文件
步骤二: 上传图片到腾讯云
前置准备: 在云服务器上面: 申请cos服务器,配置密钥,设置cors访问
目标:: 用前面注册的对象存储功能,将图片上传到腾讯云,根据cos的上传API实现上传功能,
1. 安装依赖:
npm i cos-js-sdk-v5 --save
2. 实例化cos对象
// 下面的代码是固定写法
const COS = require('cos-js-sdk-v5')
// 填写自己腾讯云cos中的key和id (密钥)
const cos = new COS({
SecretId: 'xxx', // 身份识别ID
SecretKey: 'xxx' // 身份秘钥
})
上面的SecretId和SecretKey在这里可以找到:

3. 使用cos对象完成上传:
要是用cos.putObjectapi来完成上传功能,代码如下:
// 定义在methods里面
upload(res) {
if (res.file) {
// 执行上传操作
cos.putObject({
Bucket: 'xxxxxx', /* 存储桶 */
Region: 'xxxx', /* 存储桶所在地域,必须字段 */
Key: res.file.name, /* 文件名 */
StorageClass: 'STANDARD', // 上传模式, 标准模式
Body: res.file // 上传文件对象
}, (err, data) => {
console.log(err || data)
// 上传成功之后
if (data.statusCode === 200) {
// 注意这里!!!已经拿到了cos返回给我们的头像地址了!!!!拿到了以后就要用它来操作下面的事情了(子传父,把这个头像给父亲,然后父亲保存在本地接口)
this.imageUrl = `https:${data.Location}`
}
})
}
}

步骤三: 在用户详情页中使用
上面两个步骤都是定义在upload组件中的, 接下来的步骤就是在父组件使用
思路:
1. 初始时显示: 在获取员工详情时,拿到员工的头像之后,让上传组件来显示头像;
2. 在保存修改时:从上传组件中获取图片上传到cos之后的地址,再调用接口做上传本项目的服
务器
1. 回显头像方法一: 通过ref
子组件上引用: ref=staffPhoto
async loadUserDatailById() {
const res = await getUserDetailById(this.userInfo.id)
console.log('获取个人信息', res)
this.userInfo = res.data
// 把头像地址 给子组件显示出来
this.$refs.staffPhoto.imageUrl = res.data.staffPhoto
},
2. 更新数据
在更新请求里面,把刚刚子给我们的地址 保存在服务器
代码就不演示了,就是发送保存的ajax,然后:
// 注意更新头像地址
this.userInfo.staffPhoto = this.$refs.uploadImg.imageUrl
回显方法2: v-model-简直太重要了,面试可能还会问到
面试官: 你有在自定义的组件上用过v-model吗?
1. 代码:
<el-form-item label="员工头像">
<!-- <img :src="userInfo.staffPhoto"> -->
<!-- 放置上传图片 -->
<Upload v-model="userInfo.staffPhoto" />
</el-form-item>
分析: 背后做的事情: 也是依据这个来的
<com v-model="imageUrl" />
上面的写法等价于:
<com :value="imageUrl" @input="val=>imageUrl=val" />
1. 给子组件内部传一个名为value的属性,属性值就是绑定的数据项
2. 在子组件监听一个名为input的事件,回调函数是:将收到的参数值保存到数据项中

代码我就不写了,直接看图吧: