HTML5+Canvas调用手机拍照功能实现图片上传(上)


Posted in Javascript onApril 21, 2017

因为最近一段时间,一直在弄微信项目,其中涉及到了证件上传的功能,刚开始的时候一点头绪都没有,上网查了很多资料,QQ群里面也问了不少人,很多人说如果是app程序,可以申请系统权限,然后再去调用系统底层的东西,但是微信是在浏览器里面操作的,我们自定义的页面也是通过微信内置浏览器打开的,而且微信浏览器在内部进行了很多特殊处理,屏蔽了很多东西,所以要在页面调用拍照功能或者是打开手机系统的图库目录是不可能的,当然,这些都只是大伙儿理论上的猜测而已,而在我查了两天的资料之后,发现这个问题原来是可以解决的,而且实现的过程居然也很简单。只是用到了HTML5的file文件上传功能,再配合canvas即可。下面附上源代码:

<html> 
<meta name="viewport" content="height=device-height, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> 
<meta name="format-detection" content="telephone=yes"> 
<head> 
 <meta charset="UTF-8"> 
 <title>上传证件</title> 
 <style> 
 body { 
  margin: 20px 20%; 
  color:#777; 
  text-align: center; 
 } 
 #result{ 
  margin-top: 20px; 
 } 
 </style> 
</head> 
<body> 
 <h1 class="text-center">上传证件...</h1> 
 <hr/> 
 <input type="file"/> 
 <div id="result" align="center"></div> 
 <hr/> 
 
 <!-- 引入jQuery --> 
 <script type="text/javascript" src="../js/jQuery/jquery-1.9.1.min.js"></script> 
 <script type="text/javascript" src="../js/LocalResizeIMG.js"></script> 
 
 <!-- mobileBUGFix.js 兼容修复移动设备 --> 
 <script src="../js/mobileBUGFix.mini.js" type="text/javascript"></script> 
 <script type="text/javascript"> 
 $("input:file").localResizeIMG({ 
  width: 500, 
  quality: 0.8, 
  success: function (result) { 
  var img = new Image(); 
  img.src = result.base64; 
  console.log(result.clearBase64); 
  //$("body").append(img); 
  $("#result").empty(); 
  $("#result").append(img); //呈现图像(拍照?果) 
  $.ajax({ 
   url: "upLoadImageServlet", 
   type: "POST", 
   data:{formFile:result.clearBase64}, 
   dataType: "HTML", 
   timeout: 1000, 
   error: function(){ 
   alert("Error loading PHP document"); 
   }, 
   success: function(result){ 
   //alert(result); 
   //console.log(result); 
   alert("Uploads success~") 
   } 
  }); 
  } 
 }); 
 </script> 
</body> 
</html>

上面实现的流程导致是这样的,首先在前端把图片进行压缩,因为手机的不同,可能有的手机拍照给力,像素高,拍出来的图片的大小就相对大一些,所以这里通过一个插件进行了压缩,然后转换成为Base64的编码,再把Base64的编码使用AJAX来POST到服务器,然后在Java或者PHP后台进行Base64解码,解出来的路径即为上传图片的路径地址,然后再进行存储,写到文件或者数据库里面。

此外,这里需要说明一个问题:很多人都说到了微信内置浏览器,之前我也一直认为微信内置浏览器就是微信自己开发的一套浏览器,然后对很多东西进行了限制。其实不是这样的,微信本身并没有再重新开发一套浏览器,而是调用的系统自身的浏览器,是根据手机的不同系统而变化的。微信内置浏览器调用的是手机系统默认浏览器,ios和Android系统默认浏览器都是webkit内核,只是对HTML5和CSS3的支持程度可能不同。因为浏览器只是系统的一部分,因此系统默认浏览器不会单独升级,对HTM5、CSS3的支持程度与系统版本有很大关系。安卓版微信直接调用系统浏览器内核, iOS则是调用safari,大家可以看到下面1和3的效果是一模一样的,1是微信浏览器打开的,3则是魅族MX 3自带的系统浏览器打开的效果。

上面我的我都测试过了,可以正常运行。下面附上几张照片:

1、这是在微信里面打开的效果

HTML5+Canvas调用手机拍照功能实现图片上传(上)HTML5+Canvas调用手机拍照功能实现图片上传(上)

2、这是在手机UC浏览器打开的效果:

HTML5+Canvas调用手机拍照功能实现图片上传(上)

HTML5+Canvas调用手机拍照功能实现图片上传(上)

3、这个是在系统自带浏览器里面打开的效果(ps:我的手机是魅族MX 3),但是这个不是打开系统图库目录,而是直接定位到了系统的文件夹根目录。

HTML5+Canvas调用手机拍照功能实现图片上传(上)HTML5+Canvas调用手机拍照功能实现图片上传(上)

下一篇会讲到在Java后台进行图片上传操作:

HTML5+Canvas+jQuery调用手机拍照功能实现图片上传(二)

插件地址:https://github.com/think2011/LocalResizeIMG

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
fromCharCode和charCodeAt 方法
Dec 27 Javascript
爱恋千雪-US-AscII加密解密工具(网页加密)下载
Jun 06 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
Oct 22 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
js实现简单随机抽奖的方法
Jan 27 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
Servlet实现文件上传,可多文件上传示例
Dec 05 Javascript
Bootstrap 模态框实例插件案例分析
Dec 28 Javascript
vue-infinite-loading2.0 中文文档详解
Apr 08 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
vue打包时去掉所有的console.log
Apr 10 Vue.js
HTML5实现微信拍摄上传照片功能
Apr 21 #Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
Apr 21 #jQuery
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
Apr 21 #Javascript
H5图片压缩与上传实例
Apr 21 #Javascript
H5手机端多文件上传预览插件
Apr 21 #Javascript
ES6新特性八:async函数用法实例详解
Apr 21 #Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 #Javascript
You might like
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
php数组遍历类与用法示例
2019/05/24 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
python 快速排序代码
2009/11/23 Python
python对excel文档去重及求和的实例
2018/04/18 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
python爬虫请求头的使用
2020/12/01 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
四年大学生活的个人自我评价
2013/12/11 职场文书
先进德育工作者事迹材料
2014/01/24 职场文书
初一新生军训方案
2014/05/22 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
文明社区申报材料
2014/08/21 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
公司周年庆寄语
2019/06/21 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android
解析redis hash应用场景和常用命令
2021/08/04 Redis