博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS—图片压缩上传(单张)
阅读量:6106 次
发布时间:2019-06-20

本文共 4022 字,大约阅读时间需要 13 分钟。

*vue+webpack环境,这里的that指到vue实例

一、图片压缩

/*        file:文件(类型是图片格式),        obj:文件压缩后对象width, height, quality(0-1)        callback:容器或者回调函数    */    photoCompress(file,obj,callback){        let that=this;        let ready=new FileReader();        /*开始读取指定File对象中的内容. 读取操作完成时,返回一个URL格式的字符串.*/        ready.readAsDataURL(file);        ready.onload=function(){            let re=this.result;            that.canvasDataURL(re,obj,callback)  //开始压缩        }    },
/*利用canvas数据化图片进行压缩*//*图片转base64*/    canvasDataURL(path, obj, callback){                let img = new Image();        img.src = path;        img.onload = function(){            let that = this;   //指到img            // 默认按比例压缩            let w = that.width,                h = that.height,                scale = w / h;            w = obj.width || w;            h = obj.height || (w / scale);            let quality = 0.7;  // 默认图片质量为0.7            //生成canvas            let canvas = document.createElement('canvas');            let ctx = canvas.getContext('2d');            // 创建属性节点            let anw = document.createAttribute("width");            anw.nodeValue = w;            let anh = document.createAttribute("height");            anh.nodeValue = h;            canvas.setAttributeNode(anw);            canvas.setAttributeNode(anh);            ctx.drawImage(that, 0, 0, w, h);            // 图像质量            if(obj.quality && obj.quality <= 1 && obj.quality > 0){                quality = obj.quality;            }            // quality值越小,所绘制出的图像越模糊            let base64 = canvas.toDataURL('image/jpeg', quality);            // 回调函数返回base64的值            callback(base64);        }    },

二、base64转文件

这里后台接口不支持base64,根据实际接口情况使用

/*这里转blob*/    base64UrlToBlob(urlData){        let arr = urlData.split(','),         mime = arr[0].match(/:(.*?);/)[1],  // 去掉url的头,并转化为byte        bstr = atob(arr[1]),    // 处理异常,将ascii码小于0的转换为大于0        n = bstr.length,         u8arr = new Uint8Array(n);        while(n--){            u8arr[n] = bstr.charCodeAt(n);        }        return new Blob([u8arr], {type:mime});        //转file        //return new File([u8arr], filename, {type:mime});    },

三、上传图片

selectImgs(e) {    //选择文件后执行      let that=this      let fileObj=e.target.files[0]  //获取file      //console.log(fileObj)      var form = new FormData();  // 创建FormData 对象      if(fileObj.size/1024 > 1025) { //文件大于1M(根据需求更改),进行压缩上传          that.photoCompress(fileObj, {   //调用压缩图片方法              quality: 0.2          }, function(base64Codes){              //console.log("压缩后:" + base.length / 1024 + " " + base);              let bl = that.base64UrlToBlob(base64Codes);              //console.log(bl)              form.append("file", bl, "file_"+Date.parse(new Date())+".jpg"); // 文件对象              that.imgRequest(form);  //请求图片上传接口          });      }else{ //小于等于1M 原图上传          form.append("file", fileObj); // 文件对象          that.imgRequest(form);   //请求图片上传接口      }    },
/*图片上传接口*/    imgRequest(param){      PostSaveImg(    //封装的ajax(axios)方法          param      ).then(data => {          if (data.status === 200 || data.status === 304){            let item={              path:this.imgpath+data.data[0].path,            }            let jsonitem={              jlid:this.jlid,              path:data.data[0].path,              xxdm:this.xxdm,            }            this.imglistJson.push(jsonitem)            this.imglist.push(item)          }else{             Toast({    //封装的提示方法                message: '图片上传失败',                position: 'middle',                duration: 2000              })          }       })            /*原生请求*/      // const xhr = new XMLHttpRequest()         // xhr.open('POST', HOSTMOBILE+'api/mobile/xcjg/sctp', true)   //接口地址      // xhr.send(param)      //  xhr.onload = () => {      //   if (xhr.status === 200 || xhr.status === 304) {      //     let datas = JSON.parse(xhr.responseText)      //     console.log('response: ', datas)      //   } else {      //     alert(`${xhr.status} 请求错误!`)      //   }      // }          },

其他

转载地址:http://chiza.baihongyu.com/

你可能感兴趣的文章
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
abb画学号
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>