element ui的upload 手动上传头像(复制就能用)

 

之前在网上看了好多,结果给的代码都不全,整了快一天,才整好,心态都崩了,想砸电脑

这里贴出来愿后来人省力 

下面的代码除了最下面的axios请求需要和自己的匹配之外。其他的可以直接复制使用了

 

服务器接口处理函数

这里只是处理函数,其余的部分没有贴,因为要贴就要贴很多node服务器的代码了

这里有需要提交两个参数,第一个是需要手动上传的base64格式的字符串,第二个时用户的id

这里因为是请求用户信息成功之后了,本地的token存储了用户id,这里默认能检测到,就不需要再手动上传了

// 更新用户头像
exports.updateAvatar = (req,res) => {
    // 通过Id来进行定位更改信息
   const sql = `update ev_users set user_pic=? where id=?`
   db.query(sql,[req.body.avatar,req.user.Id],(err,results) => {
    if(err) return res.cc('更换头像失败')
    if(results.affectedRows !== 1) return res.cc('影响多行')
    res.cc('更换头像成功',0)
   })
}

 vue代码

如果不需要token验证的话,可以把:headers="headers"删掉

标数字的注释下面的代码都是需要和自己的后台接口匹配的

<template>
    <div>
        <el-upload class="avatar-uploader" accept="JPG, .PNG, .JPEG,.jpg, .png, .jpeg" :action="url" list-type="picture"
            :headers="headers" :multiple="false" :show-file-list="false" :http-request="uploadImg">
            <img v-if="imgString" :src="imgString" class="avatar" />
            <i v-else class="el-icon-plus avatar-uploader-icon" size="mini"></i>
        </el-upload>
        <el-button type="primary" size="mini" @click="update_userInfo()">
            确认修改</el-button>
    </div>
</template>

<script>
import axios from 'axios'
//配置axios
//1.axios的默认根地址
axios.defaults.baseURL = 'http://127.0.0.1:3000'
// axios请求拦截
// 为保证其他的页面在每次请求时都确保是登录状态,便需要拦截器在请求之前加入token令牌,来让
// 后台知道此时已经登录
//request为请求,use为回调函数
axios.interceptors.request.use(config => {
    // 为请求头对象,添加 Token 验证的 Authorization 字段
    config.headers.Authorization = window.sessionStorage.getItem('token')
    return config
})
export default {
    data() {
        return {
            // base64 格式字符串
            imgString: "",
            // 2.图片上传路径
            url: "http://127.0.0.1:3000/my/update/avatar",
            // 图片上传头部信息(如果需要token就需要携带头部信息)
            headers: {
                Authorization: window.sessionStorage.getItem("token"),
            },
        };
    },
    methods: {
        // 转换base64方法时Promise对象,必须换成同步
        // 网上还有其它办法,但是尝试过后,这个方法出错的概率最低
        async uploadImg(file) {
            // 这里不一定是file.file,如果使用的方法不一样,有的是file.raw
            // 这里传入的应该是组件中携带的文件信息
            let base64Str = await this.getBase64(file.file);
            this.imgString = base64Str;
        },
        // 获取图片转base64,这里用的是Promise,所以调用方法时必须转换成同步(async,await)
        // 否则上传数据时好时坏,能不能上传成功全看运气 ^_^
        getBase64(file) {
            return new Promise(function (resolve, reject) {
                const reader = new FileReader();
                let imgResult = "";
                reader.readAsDataURL(file);
                reader.onload = function () {
                    imgResult = reader.result;
                };
                reader.onerror = function (error) {
                    reject(error);
                };
                reader.onloadend = function () {
                    resolve(imgResult);
                };
            });
        },
        //3.确认修改之后上传修改信息 axios请求
        async update_userInfo() {
            const { data: res } = await axios.post('/my/update/avatar', { avatar: this.imgString })
            console.log(res);
        }
    },
};
</script>

<style scoped lang="less">
// 头像上传区
.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: 100px;
    height: 100px;
    display: block;
    border-radius: 50%;
    margin: 20px 0 0 20px;
}
</style>

 

Element UI 提供了一个名为 "Upload" 的组件,它可以帮助开发者构建文件上传功能。在创建图片墙上传动画时,你可以利用 Upload 组件的 "preview-file" 属性来显示预览图,并通过自定义事件处理来自定义上传过程中的视觉反馈。 例如,你可以设置 `file-list` 样式来改变列表项在上传开始、上传中和上传完成时的状态,比如增加加载动画。当文件开始上传时,可以添加一个 "旋转图标" 或者 "进度条" 显示加载状态。当上传成功时,可以切换到已上传的图片缩略图样式,或者更改背景颜色表示已完成。 为了实现这样的效果,你可能会用到 Vue.js 的 `v-if` 和 `v-show` 指令,以及 CSS 动画库如 Vue Awesome Spinners 来展示旋转动画。同时,你可以监听 Upload 组件的 `upload-success` 或 `upload-error` 事件,以便在上传完成后更新状态信息。 下面是一个简化的示例: ```html <template> <el-upload :action="uploadUrl" list-type="picture-card" :auto-upload="false" :on-change="handleImageChange" :before-upload="beforeUpload" > <el-button size="small">点击上传</el-button> </el-upload> <!-- 自定义的上传状态元素 --> <transition name="fade"> <div v-if="showProgress" class="upload-progress"> <i class="fa fa-spinner fa-spin"></i> 上传中... </div> </transition> </template> <script> import { mapActions } from 'vuex' export default { methods: { ...mapActions(['uploadFile']), handleImageChange(file) { this.showProgress = true // 显示上传进度 this.uploadFile(file) .then(() => { this.showProgress = false // 隐藏上传进度,显示图片预览 }) .catch((error) => { // 错误处理 }) }, beforeUpload(file) { return true // 省略实际验证逻辑 } } } </script> <style scoped> .upload-progress { display: none; /* 添加你喜欢的动画样式 */ } .fade-enter-active, .fade-leave-active { transition: all 0.5s ease; } </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值