(ES6)vue从读取图片到压缩图片,再到读取base64图片上传到后端

作者是在vue上做的开发,可能对有学过vue学者比较友好

首先,我们看看整个执行过程的类型转换

input --> FileList --> File --> base64 --> Blob --> ajax(Blob)提交

那么先从元素开始吧

HTML

      <input type="file" @change="upimg" accept="image/*" />

JS

base64转blob

//此处转载https://www.cnblogs.com/fj99/p/5502130.html
/**
 * 
 * @param {*base64字符串} dataurl
 * @return {Blob文件类型}  
 */
export function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

压缩图片代码 此处自创

/**
 * 采用递归算法,在移动端也测试过,10M也基本没问题,现在的手机随便一张照片
 * 就上3M了,这可以减少不少服务器的负担
 *
 * @param {*img标签的加载事件参数} img 
 * @return {*处理最终结果返回图片base64编码} base64data
 * 
 */
export function scaleimg(img){
    let height=img.currentTarget.height;
    let width=img.currentTarget.width;
    let base64data='';
    let can=document.createElement("canvas");
    can.height=height;
    can.width=width;
    let casimg=can.getContext('2d');
    casimg.clearRect(0, 0,width,height);
    casimg.drawImage(img.currentTarget,0,0,width,height);
    base64data=can.toDataURL('image/jpeg');                                  //获取在canvas元素中的图片截图base64编码
    let size=Math.round( dataURLtoBlob(base64data).size/1024);              //获取压缩前的图片大小
    let maxsize=800;                                                        //设置压缩后的最大值
    if(size>maxsize){
        if(size<1300){
            img.currentTarget.height=Math.round(height*(3/4));
            img.currentTarget.width=Math.round(width*(3/4));
            return scaleimg(img)
        }
        else if(size<1800){
            img.currentTarget.height=Math.round(height*(2/3));
            img.currentTarget.width=Math.round(width*(2/3));
            return scaleimg(img)
        }
        else{
            img.currentTarget.height=Math.round(height/2);
            img.currentTarget.width=Math.round(width/2);
            return scaleimg(img)
        }   
    }
    else{
        console.log('压缩后大小'+size);
        return base64data;
    }
}


change事件方法

    import axios from "axios"
    import { dataURLtoBlob, scaleimg } from "./handlerimg.js";


    upimg(e) {
      let name = e.target.name
      let file = e.target.files[0]
      let filesize = file.size / 1024
      let data = new FileReader()
      let img = new Image()
      let formatdata = ""
      data.onload = e1 => {
        img.onload = e => {
          console.log("压缩前大小" + dataURLtoBlob(e1.target.result).size / 1024); //压缩前大小
          if (/^image\/([a-zA-Z]|\*)+$/.test(file.type)) {
            formatdata = scaleimg(e)
            //#region 提交Blob格式图片文件
            let config = {
              headers: { "Content-Type": "multipart/form-data" }
            };
            let param = new FormData()
            param.append("file", dataURLtoBlob(formatdata));
            axios.post("/uploadimage", param, config).then(res => {
              this.$store.commit('showload',false)                                //关闭加载动画
              document.getElementById('img').src=res.data
            }).catch(res=>{this.$store.commit('SET_showload',false)})  //关闭加载动画
            //#endregion
          }
        };
        img.src = e1.target.result                                     //触发加载img load事件
      };
      this.$store.commit('showload',true)                          //触发加载动画
      data.readAsDataURL(file)                                         //触发加载filereader load事件
    }
版权声明:本文为博主原创文章,转载请说明来源。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容