• vue实现头像上传


    一、html部分:

    二、js部分(由于本项目用ts写的,差异的地方请各位自己调整下)

    <script lang="ts"> 
    import {XtVue, Component, Watch, XtRouter,Prop} from "../../../common/common";
    import {AxiosResponse} from 'axios';

    @Component
    export default class UploadHeadComp extends XtVue{
    //头像信息
    public headInfo:any = {
    src:require('../../../assets/images/icon/user_default.png')
    }
    //头像文件
    public file:any = null

    //挂载
    mounted() {
    console.log('头像上传');
    }
    /**
    * 触发input[type='file']点击
    * */
    public uploadHeadImg(){
    this.$el.querySelector('.headInputFile').click();
    }
    /**
    * 头像图片改变
    * */
    public handleHeadChange(e){
    //两个的区别是:ie下支持e.srcElement,ff支持e.target
    let $target:any = e.target || e.srcElement;
    let file:any = $target.files[0];
    this.file = file;
    //判断上传文件是否是图片类型:w 的释义都是指包含大 小写字母数字和下划线 相当于([0-9a-zA-Z])
    if(!/image/w+/.test(file.type)){
    this.$notify.error({title: '错误',message: '请上传图片文件'});
    return;
    }
    //获取图片大小,做图片大小限制
    let imgSize:any = file.size;
    //图片大小限制为5M,这里获取的单位大小为b
    if(imgSize > 5*1024*1024){
    this.$notify.error({title: '错误',message: '图片大小限制为5M'});
    return;
    }
    /**
    * 开始渲染选择的图片的两种方式:1、本地路径方法,2、base64方法
    * 两种方法区别:
    * 1、通过FileReader.readAsDataURL(file)可以获取一段data:base64的字符串;通过URL.createObjectURL(blob)可以获取当前文件的一个内存URL。
    * 2、执行时机:createObjectURL是同步执行(立即的);FileReader.readAsDataURL是异步执行(过一段时间)。
    * 3、内存使用:createObjectURL返回一段带hash的url,并且一直存储在内存中,直到document触发了unload事件(例如:document close)或者执行revokeObjectURL来释放;
    * FileReader.readAsDataURL则返回包含很多字符的base64,并会比blob url消耗更多内存,但是在不用的时候会自动从内存中清除(通过垃圾回收机制)。
    * 4、优劣对比:使用createObjectURL可以节省性能并更快速,只不过需要在不使用的情况下手动释放内存;
    * 如果不太在意设备性能问题,并想获取图片的base64,则推荐使用FileReader.readAsDataURL。
    * */
    // 本地路径方法 1
    // this.headInfo.src = window.URL.createObjectURL(e.target.files[0]);
    // base64方法 2
    //FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据
    let reader:any = new FileReader();
    //onload 事件会在页面或图像加载完成后立即发生
    reader.onload = (data) => {
    let res = data.target || data.srcElement;
    this.headInfo.src = res.result
    },
    //FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL
    reader.readAsDataURL(file);
    //将上传的头像图片提交给后台
    this.handleUploadHead();
    }
    /**
    * 头像上传给后台
    * */
    public handleUploadHead(){
    let file:any = this.file;
    let picData:any = new FormData();
    picData.append('file',file,file.name);
    //接口请求,根据自身项目做调整,这里只是简单介绍
    axios.post({
    url:"接口url",
    method:'post',
    data:picData,
    }).then(res=>{
    if(res.data.success == true){
                //这里是借用elelment UI的消息提示
    this.$notify.success({title: 'success',message: '头像图片上传成功'});
    return;
    }
    this.$notify.error({title: '错误',message: res.data.msg});
    }).catch(err=>{
    console.log(err);
    })
    }
    }
    </script>

    说明:
    1、
    handleHeadChange这个方法是做一些简单校验和判断,介绍了两种本地展示,在实际项目中,这步可以省略,直接将获取的头像文件数据传给后台,在通过后台接口获取头像路径
    不足:
    1、后期有时间会对这篇博客优化,优化内容是加上图片裁剪功能,如果有需要要js的可以联系我,js方法的裁剪、图片放大和缩小是有的
  • 相关阅读:
    微信用户授权,获取code
    关于swiper在vue中不生效的问题
    ES6-Set 和 Map 数据结构
    Js中caller和callee的区别
    类与对象基础总结--继承,多态
    java 类与对象基础整理
    java 的数据库操作--JDBC
    Socket的长连接和短连接
    java 的底层通信--Socket
    算法--树与递归
  • 原文地址:https://www.cnblogs.com/lqqchangeload/p/12870418.html
Copyright © 2020-2023  润新知