需求来源:之前有个提交审核表单的业务,表单中含有大量附件图片,大约有20多张吧,为了省事,采用的同步上传,一次需要上传很多照片,本来单张图片限制为200KB,这样子总图片大小约为5MB左右,想想也可以接收。业务上线后,得知用户大部分都是中老年人居多,手机拍照的图片很大,不会压缩。放开图片尺寸上传限制后,上传数据太大,体验很不好,就有了前台图片压缩的需求。

业务实现要点:

1、上传的图片使用canvas压缩图片,并导出base64字符串数据;

2、每一类型附件可以传多张图片,这些图片的base64数据存放到hashmap集合中,key值为file的id;

3、后台将接收到图片的base64字符串转存为图片格式。

核心业务代码如下:

-- 前台图片压缩保存

/*** 存储图片数据* @param _this* @param picType*/
function picStrore(_this,picType) {var obj = $(_this);var id = obj.attr('id');// 元素id// $("#fw_pic_1")[0].files[0]  是否包含文件var file = $("#"+id)[0].files[0];if(file){ // 有图片imgeToBase64_save(file,id,picType); // 保存数据到hashmap}else{ // 无图片removeImgdata(id,picType); // 从hashmap中移除数据}
}
/*** 将图片转成base64字符串存储hashmap中* @param file  文件对象* @param fileId 元素id* @param picType 文件类型* @returns {boolean}*/
function imgeToBase64_save(file,fileId,picType) {if (!/image\/\w+/.test(file.type)) {return false;}var reader = new FileReader();reader.readAsDataURL(file);reader.onload = function (e) {var img = new Image,width = 640,quality = 0.8,canvas = document.createElement("canvas"),drawer = canvas.getContext("2d");img.src = this.result;img.onload = function () {// 计算绘图尺寸(重构的图片尺寸宽度显示最大为640,图片质量设置为0.8) if (img.height > img.width) {if (img.width < width) {canvas.width = img.width;canvas.height = img.height;} else {canvas.width = width;canvas.height = width * (img.height / img.width);}} else {if (img.height < width) {canvas.width = img.width;canvas.height = img.height;} else {canvas.height = width;canvas.width = width * (img.width / img.height);}}drawer.drawImage(img, 0, 0, canvas.width, canvas.height);var tmpsrc = canvas.toDataURL("image/jpeg", quality);var imgbase64 = tmpsrc.substr(23); // base64字符串// 保存base64数据到hashmapif('fw_pic'== picType){ // 房屋所有权证fw_pic_map.put(fileId,imgbase64);}else if('td_pic'== picType){ // 国有土地使用权证td_pic_map.put(fileId,imgbase64);}else if('bdc_pic'== picType){ // 不动产权证bdc_pic_map.put(fileId,imgbase64);}else if('syf_pic'== picType){ // 住房买卖合同syf_pic_map.put(fileId,imgbase64);}else if('fp_pic'== picType){ // 购房发票fp_pic_map.put(fileId,imgbase64);}else if('sfz_pic'== picType){ // 身份证sfz_pic_map.put(fileId,imgbase64);}else if('zl_pic'== picType){ // 户口簿资料页zl_pic_map.put(fileId,imgbase64);}else if('gzs_pic'== picType){ // 委托书/公证书/通知书gzs_pic_map.put(fileId,imgbase64);}else if('other_pic'== picType){ // 其他材料other_pic_map.put(fileId,imgbase64);}}}
}
/*** 从hashmap中移除数据* @param fileId* @param picType*/
function removeImgdata(fileId,picType) {if('fw_pic'== picType){ // 房屋所有权证fw_pic_map.remove(fileId);}else if('td_pic'== picType){ // 国有土地使用权证td_pic_map.remove(fileId);}else if('bdc_pic'== picType){ // 不动产权证bdc_pic_map.remove(fileId);}else if('syf_pic'== picType){ // 住房买卖合同syf_pic_map.remove(fileId);}else if('fp_pic'== picType){ // 购房发票fp_pic_map.remove(fileId);}else if('sfz_pic'== picType){ // 身份证sfz_pic_map.remove(fileId);}else if('zl_pic'== picType){ // 户口簿资料页zl_pic_map.remove(fileId);}else if('gzs_pic'== picType){ // 委托书/公证书/通知书gzs_pic_map.remove(fileId);}else if('other_pic'== picType){ // 其他材料other_pic_map.remove(fileId);}
}

-- 后台图片保存

 /*** 保存BASE64图片数据* @param imgStr 图片base64数据* @param savePath 图片保存路径*/public static void saveBase64Img(String imgStr,String savePath) {if (imgStr == null) //图像数据为空return;BASE64Decoder decoder = new BASE64Decoder();try {//Base64解码byte[] b = decoder.decodeBuffer(imgStr);for(int i=0; i<b.length; ++i) {if(b[i]<0) {b[i]+=256; //调整异常数据}}//生成jpeg图片OutputStream out = new FileOutputStream(savePath);out.write(b);out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}

压缩效果:压缩后的图片附件总大小控制在1MB左右。
注:canvas的大小有限制,如果canvas的大小大于大概五百万像素(即宽高乘积)的时候,不仅图片画不出来,其他什么东西也都是画不出来的。

坑:前台上传使用ajax提交请求,但是必须保证enctype = "multipart/form-data",否则post的数据长度会超出限制,使用FormData对象提交请求,具体代码如下:

    var formData = new FormData();formData.append('buyerone',$("#buyerone").val());formData.append('buyerone_no',$("#buyerone_no").val());formData.append('buyerone_phone',$("#buyerone_phone").val());formData.append('buyertwo',$("#buyertwo").val());formData.append('buyertwo_no',$("#buyertwo_no").val());formData.append('buyertwo_phone',$("#buyertwo_phone").val());formData.append('buyerthree',$("#buyerthree").val());formData.append('buyerthree_no',$("#buyerthree_no").val());formData.append('buyerthree_phone',$("#buyerthree_phone").val());formData.append('handler',$("#handler").val());formData.append('handler_no',$("#handler_no").val());formData.append('handler_phone',$("#handler_phone").val());formData.append('remark',$("#remark").val());formData.append('house_site',$("#house_site").val());formData.append('house_area',$("#house_area").val());formData.append('loft_area',$("#loft_area").val());formData.append('sign_date',$("#sign_date").val());formData.append('ownership_no',$("#ownership_no").val());formData.append('landuse_no',$("#landuse_no").val());formData.append('immovable_no',$("#immovable_no").val());formData.append('apply_type',$("input[name='apply_type']:checked").val());formData.append('buy_total',$("#buy_total").val());formData.append('house_price_v',$("#house_price_v").val());formData.append('loft_price_v',$("#loft_price_v").val());formData.append('estimate_total_v',$("#estimate_total_v").val());formData.append('pay_price_v',$("#pay_price_v").val());formData.append('fw_pic',fw_pic);formData.append('td_pic',td_pic);formData.append('bdc_pic',bdc_pic);formData.append('syf_pic',syf_pic);formData.append('fp_pic',fp_pic);formData.append('sfz_pic',sfz_pic);formData.append('zl_pic',zl_pic);formData.append('gzs_pic',gzs_pic);formData.append('other_pic',other_pic);$.ajax({url: http_url+"/api/upfile/houseApplyUpload2",type: "POST",cache: false,data: formData,processData: false,contentType: false,dataType: "json",success: function(res){var resobj = res;if(resobj.code=="4901"){ // 上传文件超限window.parent.layer.alert("上传文件大小超出限制", {icon: 0});}else if(resobj.code=="0000"){var data = resobj.data;var isSuccess = data.isSuccess;var msg = data.msg;if(isSuccess==0){ //成功window.location.href="houseApplyOk.shtml";}else if(isSuccess==1){// 失败window.parent.layer.alert(msg, {icon: 0});}else{ // 异常window.parent.layer.alert("申请审核表提交失败", {icon: 0});}}window.parent.layer.close(ha_index);// 清除加载},error:function(res) {window.parent.layer.close(ha_index);// 清除加载}});

前台图片Canvas压缩上传小结相关推荐

  1. ie js html 压缩,H5图片裁剪-压缩-上传-神奇的Croppie.js

    Croppie.js之图片裁剪压缩上传 h5图片裁剪, 压缩, 上传, 预览是常见功能, 幸运的是我们有cropp.js这款利器. 1. style .actions button, .actions ...

  2. CANVAS运用-对图片的压缩上传(仅针对移动浏览器)

    最近在移动端设计头像上传功能时,原本是以<input type="file">直接通过formData上传,然而实际使用情况是:对于过大的图片(高像素手机所拍摄的照片等 ...

  3. uniapp小程序图片前端压缩上传

    目录 1,前言 2,实现代码 1,前言 这次项目中做了一个图片上传,要求是大于2MB的就压缩成2MB一下的再上传,我这边利用了uniapp的文件接口,使用canvas做了一个压缩上传的功能,目前已上线 ...

  4. jquery获取图片并压缩上传

    话不多说,直接上代码: <input id="input-file" type="file" multiple="multiple" ...

  5. 前端实现图片压缩上传功能

    以移动端为例,在H5上传图片时,由于机型 / 网速 / 流量等限制,在低版本机型上经常会出现上传的图片太大导致上传很慢甚至崩溃的情况,所以需要对在某些情况下需要对上传的图片进行压缩上传. 以下以移动端 ...

  6. JS—图片压缩上传(单张)

    *vue+webpack环境,这里的that指到vue实例 <input type="file" name="file" accept="ima ...

  7. [html] 如何使用html5进行图片压缩上传?

    [html] 如何使用html5进行图片压缩上传? 1.获取到图片的base64格式: 2.图片加载完成后,把图片转化为canvas: 3.使用canvas的toDataURL按照自己的需要进行压缩: ...

  8. js 图片压缩上传(base64位)以及上传类型分类

    一.input file上传类型 1.指明只需要图片 <input type="file" accept='image/*'> 2.指明需要多张图片 <input ...

  9. 前端图片压缩上传(纯js的质量压缩,非长宽压缩)

    前端图片压缩上传(纯js的质量压缩,非长宽压缩) 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> ...

最新文章

  1. Activiti——工作流程-核心API(二)
  2. c 5.6 mysql 配置文件_Windows系统中MySQL 5.6的配置文件(my.ini)修改方法_MySQL
  3. 一个平行四边形可以分成四个_【八年级下】数学 平行四边形(3)菱形
  4. 下一个排列Python解法
  5. 如何成功搞垮一个团队?
  6. oracle 内存分析工具,IDE 中的分析工具
  7. webpack--插件配置:处理HTML中的图片(七)
  8. 高并发下如何生成唯一订单号?
  9. AC自动机 学习链接
  10. 金属热处理行业调研报告 - 市场现状分析与发展前景预测
  11. Nginx 配置文件详细说明
  12. I00001 杨辉三角
  13. 摄像头录像软件测试初学者,几款好用的摄像头视频捕获工具推荐
  14. PBFT算法源码详解
  15. 多功能多接口带头像挂件制作微信小程序源码
  16. java-assured_java - rest-assured 接口测试
  17. oracle 播布客 视频,播布客视频-Managing Indexes笔记
  18. 【FTP】——文件传输协议
  19. Qt QNetworkAccessManager请求返回reply内存泄漏
  20. 【笔记】雷达原理-第五版:第四章——雷达终端

热门文章

  1. Linux开机引导流程
  2. 进口自动焊锡机器人_在线式全自动焊锡机器人
  3. 广东计算机应用专业,广东地区计算机应用技术专业报考热门高校你造吗
  4. Linux内存映射基础概念
  5. 流媒体-H264协议-编码-x264学习-主要结构体(二)
  6. 关于COM及套间(Apartment)知识
  7. C++-int最大值
  8. PCB设计---叠层、布局、布线
  9. 笔记本合上以后不关闭外接显示器
  10. matlab图像处理:顺序批量读入图片转格式输出