一、html部分:

axios 头像上传 上传头像怎么实现_axios 头像上传

 

二、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方法的裁剪、图片放大和缩小是有的