微信开发h5图片上传

开发环境

vue.js,原生h5 input file, 微信公众号网页

依赖安装

exif-js:IOS下拍照照片的方向有问题, 需要exif-js来读取照片信息进行旋转处理;
axios: 异步请求支持
vuex: 主要用来存储进度信息,

npm install exif-js --save

photoHandle.js

这里面主要是这四个方法,具体用途看注释

import EXIF from 'exif-js'
import axi
export default {
/*图片上传方法* dom:获取图片的input节点* config:{*         type: 提交到store的mutation,提交上传接口成功后返回的Url*         maxSize:Number  有此参数时,超过maxSize KB的图片会被压缩*         onload:function(e)  图片解析后的回调*         isProgress:function(e)  图片上传过程的监听回调*         success:function(res)  图片上传成功后接口回调*         fail:function(res)  图片上传失败的回调*         }* */* Orientation:'', //照片初始化角度uploadImg(){}, //解析图片,直接调用此方法会依次执行后面三个方法imageCompress(){}, //压缩图片dataURItoBlob(){}, //压缩后的base64字符串转为blob文件流对象upload(){}//ajax上传
}

每个方法的具体代码和解释:

 uploadImg(dom, config = {}) {//解析图片var $c = document.querySelector(dom),file = $c.files[0],param = new FormData(),reader = new FileReader(),fileSize = (file.size / 1024).toFixed(0),_this = this,configHeader = {headers: {"Content-Type": "multipart/form-data"   }};EXIF.getData(file, function() {_this.Orientation = EXIF.getTag(this, 'Orientation');//reader.readAsDataURL(file);reader.onload = function(e) {if (config.maxSize && fileSize > config.maxSize) { //当存在最大体积限制 进入压缩方法_this.imageCompress(this,(data)=>{setTimeout(()=>{if (config.onload) config.onload(e);param.append("file", data);_this.upload(configHeader, param, config);},0)});} else {if (config.onload) config.onload(e);param.append("file", file);_this.upload(configHeader, param, config);}};});}

压缩方法,前端压缩采用将图片转为base64 然后用canvas绘制再压缩, 如不需要压缩可以省略转码和这个步骤,自行根据应用场景和需求进行代码调整吧。

imageCompress(file,callback) { //压缩文件const _this = this;var img = new Image();var data='';img.onload = function() {let w = this.naturalWidth,h = this.naturalHeight,resizeW = 0,resizeH = 0;//压缩设置let maxSize = {  //在这里统一配置,也可以自行修改成传参width:680,      //图片最大宽度height:680,     //图片最大高度level:0.3       //图片保存质量};//计算缩放比例if(w > maxSize.width || h > maxSize.height){let multiple = Math.max(w / maxSize.width , h / maxSize.height);resizeW = w / multiple;resizeH = h / multiple;}else{resizeW = w;resizeH = h;}let canvas = document.createElement("canvas"),cxt = canvas.getContext('2d');//根据拍摄的角度进行图片旋转调整if (_this.Orientation == 3) {canvas.width = resizeW;canvas.height = resizeH;cxt.rotate(Math.PI);cxt.drawImage(img, 0, 0, -resizeW, -resizeH)} else if (_this.Orientation == 8) {canvas.width = resizeH;canvas.height = resizeW;cxt.rotate(Math.PI * 3 / 2);cxt.drawImage(img, 0, 0, -resizeW, resizeH)} else if (_this.Orientation == 6) {canvas.width = resizeH;canvas.height = resizeW;cxt.rotate(Math.PI / 2);cxt.drawImage(img, 0, 0, resizeW, -resizeH)} else {canvas.width = resizeW;canvas.height = resizeH;cxt.drawImage(img, 0, 0, resizeW, resizeH)}//base64,最终输出的压缩文件data = canvas.toDataURL('image/jpeg',maxSize.level);var  str = _this.dataURItoBlob(data);callback(str);};img.src = file.result;// console.log(img.src.length+' 压缩前');},
 dataURItoBlob: function (dataURI) {  //base64转blob// console.log(dataURI.split(',')[1],'sss');var byteString = atob(dataURI.split(',')[1]);var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];var ab = new ArrayBuffer(byteString.length);var ia = new Uint8Array(ab);for (var i = 0; i < byteString.length; i++) {ia[i] = byteString.charCodeAt(i);}return new Blob([ab], { type: mimeString });},
 upload(configHeader, param, config) {const _this = this;const baseUrl = 'http://yourapiaddress';   //接口上传地址_this.axios({url: baseUrl ,method: "post",header: configHeader,data: param,onUploadProgress: function(progressEvent) {//原生获取上传进度的事件if (progressEvent.lengthComputable) {//属性lengthComputable主要表明总共需要完成的工作量和已经完成的工作是否可以被测量//如果lengthComputable为false,就获取不到progressEvent.total和progressEvent.loadedif (config.isProgress) config.isProgress(progressEvent);}}}).then(res => {if (res.data.success) {if (config.type)store.commit(config.type, res.data.resultObject.url);if (config.success) config.success(res.data);} else {if (config.fail) config.fail();}}).catch(() => {if (config.fail) config.fail();});}

调用

import photoHandle from  './photoHandle'upLoad() {const _this = this;photoHandle.uploadImg("#imgBtn", {maxSize: 50, //最大体积kbonload: e => {//todo 图片读取成功的处理,比如显示状态上传中},isProgress: res => {let loaded = res.loaded,total = res.total;//todo 进度处理},success: res => {//todo成功},fail: res => {// todo失败}});
},

结言

理解这几个方法的作用便可分应用场景自由组合使用, 坑主要在IOS照片旋转和压缩的地方, 希望通过此文能解决您的一些问题

微信开发h5图片上传(拍照、图片压缩、IOS照片旋转)相关推荐

  1. 解决H5 IOS手机图片上传时图片会旋转90°问题

    解决H5 IOS手机图片上传时图片会旋转90°问题 Vant 官方给出的解答需要自己解决,没有处理. 解决办法主要使用了 compressorjs 插件库 一.Vant UI库Uploader 组件图 ...

  2. java 图片服务器 上传_Java实现把图片上传到图片服务器(nginx+vsftp)

    前言: 在我另一篇笔记中已经记载了如何用nginx + vsftp搭建图片服务器(请参考nginx + vsftp搭建图片服务器),并且用vsftp的客户端工具filezilla测试过已经可用.但是在 ...

  3. Java实现把图片上传到图片服务器(nginx+vsftp)

    在我另一篇笔记中已经记载了如何用nginx + vsftp搭建图片服务器,并且用vsftp的客户端工具filezilla测试过已经可用.但是在开发中应该是把用户在前端页面提交的图片保存到图片服务器中, ...

  4. 移动端图片上传后进行压缩功能

    移动端图片上传后进行压缩功能 在进行讲解上传图片压缩之前,我们先来了解下HTML5中的文件上传的基本知识点. 一: FileList对象与file对象. FileList对象表示用户选择的文件列表.在 ...

  5. 菜鸟的springboot项目图片上传及图片路径分析

    菜鸟的springboot项目图片上传及图片路径分析 说明 一.图片路径分析 二.实现图片上传 (1)单文件上传(非异步) (2)单文件上传(异步) 三.总结 四.更新配置文件 说明 更新时间:202 ...

  6. 通过url链接将图片上传oss图片显示不完整问题

    通过url链接将图片上传oss图片显示不完整问题 问题:在之前通过链接上传图片的时候,都是先获取inputStream流,然后通过available()方法获取文件大小.但是通过这种方法获取到的文件大 ...

  7. java分布式实现图片上传到图片服务器

    java分布式实现图片上传到图片服务器 操作步骤 第一步 第二步 第三步 第四步 第五步 第六步 代码实现 第七步 JS代码 大功告成!! 操作步骤 第一步 在页面中的form表单里面增加一个inpu ...

  8. python修改图片大小为30kb_Python的Tornado框架实现图片上传及图片大小修改

    图片的上传 上传图片使用了表单提交, 下面是html部分, enctype="multipart/form-data"表示不对字节进行编码,上传文件类型时需指定. input标签的 ...

  9. springboot实现图片上传和图片删除

    图片上传主要将需要上传的图片上传到对应的存储地址当中,再通过url访问图片就可以了:本文存储地址在本地,如果是在服务器上,配置服务器端的地址就可以了. controller @ApiOperation ...

  10. php 怎么上传图片,php怎么把图片上传到图片服务器

    php怎么把图片上传到图片服务器? 图片服务器代码<?php /** * 图片服务器上传API接口 * by Zx * date 2016-04-28 */ header('Content-ty ...

最新文章

  1. IDEA中如何彻底删除项目
  2. 为什么说现在是计算机视觉最好的时代?
  3. java der pem_JAVA解析各种编码密钥对(DER、PEM、openssh公钥)
  4. python人工智能学习笔记_[Python] 人工智能与自然语言处理学习笔记(1)
  5. 05-简单的输入输出
  6. C语言学习系列(六)存储类
  7. java+mysql企业进销存管理系统
  8. 微信小程序60s倒计时
  9. (附源码)ssm考试题库管理系统 毕业设计 069043
  10. oracle数据库 同义词读写操作,Oracle数据库之同义词(SYNONYM)使用
  11. origin软件画流程图_免费的网络拓扑流程图绘制软件(PaceStar LanFlow)
  12. 记录一下Python的11个小技巧
  13. 数据结构课程设计 神秘国度的爱情故事
  14. Android反编译工具与实践
  15. fastdfs上传文件的简易方法
  16. 设计模式-优惠券-策略模式
  17. 【Python特性】Python中的下划线和双下划线是什么意思?
  18. matlab 产生每次都一样的随机数
  19. 香橙派orangepi pc plus h3 启动tf卡制作
  20. 初识Java之贪吃蛇小游戏

热门文章

  1. SQL error(1046):No database selected.
  2. 机器学习英文关键词的实际意义
  3. celeron处理器_【卖萌科普】牙膏厂处理器家族介绍
  4. 苏州太仓| 第六届“创赢太仓”全球创业大赛博士后专场项目征集公告
  5. 关于《我不是药神》的一些思考
  6. 《流浪地球2》太阳风暴要来了?亚马逊云科技带你看神秘宇宙!
  7. 精简Android系统下的APP
  8. 千万级数据查询:CK、ES、RediSearch怎么选?
  9. Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片
  10. rust和gta5哪个吃配置_盘点4款Steam“自由度”很高的游戏,GTA5众所周知,目前最热门...