TML5+Canvas+jQuery实现手机拍照上传图片实例源码

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

<span style="font-family:KaiTi_GB2312;font-size:14px;"><!DOCTYPE html>
<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>上传证件...</h1>
    <hr/>
        <input type="file"/>
        <div id="result"></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></span>

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

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

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

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

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

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

1、前台js代码:

$.ajax({
                async:false,//是否异步
                cache:false,//是否使用缓存
                type: "POST",
                data:{fileData:fileData,licenceName:licenceName,cust_tax_code:cust_tax_code,phoneNum:phoneNum,state_id:state_id},
                dataType: "json",
                timeout: 1000,
                contentType : 'application/x-www-form-urlencoded; charset=utf-8',
                url: $('#ctx').val()+"CustomerCheckServlet?action=uploadLicence",
                success: function(result){
                    console.log(result);
                    if(result == true){
                        alert('Success Upload~~~');
                    }else if(result == false){
                        alert('Error Upload~~~');
                    }
                },
                error: function(){
                    alert("Error Linking~");
                }
            });

2、后台Java代码

/**
     * 证件上传
     * @param request
     * @param response
     * @throws IOException
     */
    public void uploadLicence(HttpServletRequest request,HttpServletResponse response) throws IOException{
        log.info("=====================uploadLicence");
        df = new SimpleDateFormat("yyyy-MM-dd");
         
        String cust_tax_code = request.getParameter("cust_tax_code");
        String phoneNum = request.getParameter("phoneNum");
        String licenceName = request.getParameter("licenceName");
         
        String fileData = request.getParameter("fileData");//Base64编码过的图片数据信息,对字节数组字符串进行Base64解码
        String imgPath = uploadFile(fileData,liceneName);//进行文件上传操作,上传到服务器中存放(这里是上传到服务器项目文件夹中存到)
         
        boolean result = false;//最终上传成功与否的标志
         
        custCheckInfo = new CustomerCheckInfo();
        custCheckInfo.setCust_tax_code(cust_tax_code);
        custCheckInfo.setPhonenum(phoneNum);
        custCheckInfo.setUpdate_time(df.format(new Date()));
         
        boolean save_flag = customerService.saveRegistCertInfo(custCheckInfo);//保存路径
         
        //判断数据库中的路径是否存在,并且文件夹中的文件是否存在(判断是否上传成功的标志)
        boolean is_success = isSuccessUpload(licenceName, cust_tax_code, phoneNum);
        if(save_flag && is_success){
            result = true;
        }
         
        //如果证件上传成功,则记录到记录表中
        if(result){
            StateRecordInfo record = new StateRecordInfo();
            record.setCust_tax_code(cust_tax_code);
            record.setPhonenum(phoneNum);
            record.setState_id(state_id);
             
            saveStateRecord(record);//执行状态保存操作
        }
         
        System.out.println("===result:"+result);
        PrintWriter pw = response.getWriter();
        pw.print(result);
        pw.close();
    }

/**
     * 文件上传
     * @param fileData
     * @param fileName
     * @return
     */
    public String uploadFile(String fileData,String fileName){
        //在自己的项目中构造出一个用于存放用户照片的文件夹
        String imgPath = this.getServletContext().getRealPath("/uploads/");
        //如果此文件夹不存在则创建一个
        File f = new File(imgPath);
        if(!f.exists()){
            f.mkdir();
        }
        //拼接文件名称,不存在就创建
        imgPath = imgPath + "/" + fileName + ".jpg";
        f = new File(imgPath);
        if(!f.exists()){
            f.mkdir();
        }
         
        log.info("====文件保存的位置:"+imgPath);
         
        //使用BASE64对图片文件数据进行解码操作
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            //通过Base64解密,将图片数据解密成字节数组
            byte[] bytes = decoder.decodeBuffer(fileData);
            //构造字节数组输入流
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            //读取输入流的数据
            BufferedImage bi = ImageIO.read(bais);
            //将数据信息写进图片文件中
            ImageIO.write(bi, "jpg", f);// 不管输出什么格式图片,此处不需改动
            bais.close();
        } catch (IOException e) {
            log.error("e:{}",e);
        }
        return imgPath;
    }

/**
     * 判断是否成功上传
     * @return
     */
    public boolean isSuccessUpload(String licenceName,String cust_tax_code,String phonenum){
        boolean flag = false;
        String licencePath = "";//证件图片上传成功之后保存的路径
         
        custCheckInfo = customerService.getCustomerCheckInfo(cust_tax_code, phonenum);
        licencePath = custCheckInfo.getTax_regist_cert();
     
        //判断证件路径不为空并且在上传存放的文件夹中存在,就表明以上传成功
        File f = new File(licencePath);
        if(licencePath.length() >0 && f.exists()){
            flag = true;
        }
        return flag;
    }

好了,到这里就全部结束了,这就是HTML5+jQuery+Canvas调用手机拍照功能实现图片上传的全部实现过程,总感觉自己的思路有些混乱,嗯,慢慢进步吧!

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

时间: 2024-10-26 07:00:26

TML5+Canvas+jQuery实现手机拍照上传图片实例源码的相关文章

jQuery Ajax File Upload实例源码_jquery

本文实例为大家分享了jQuery Ajax File Upload实例源码,供大家参考,具体内容如下 项目结构 Default.aspx Upload.aspx Scripts/- style.css 效果图   客户端html代码 <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="UploadFile.aspx.vb" Inherits="Web.UploadF

《锋利的jquery》实例源码下载

  想学jQuery,听说<锋利的jquery>挺好,想找个PDF下载看看,但是没找到,不过找到了实例源码.csdn的下载频道里发现的.   借用了一下可以在这里下载:<锋利的jquery>实例源码.rar    刚下载还没细看呢.

C# .net热力图实例源码

问题描述 C# .net热力图实例源码 谁有C#热力图的实例,求地址求链接,或者谁知道能在哪里学习也好,谢谢了谢谢 解决方案 http://echarts.baidu.com/doc/feature.html 自己去研究一下吧,这个是不限编程语言的,JS的一个库. ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9/10/11,chrome,firefox,S

jQuery复制表单元素附源码分享效果演示_jquery

我们在提交表单时,有时会遇到需要重复添加多个相同表单元素,如订单信息中需要添加多个不同型号的产品.表单数据中新增字段信息等.这个时候我们可以在表单中直接放置一个"新增一项"或"复制"按钮,通过点击按钮即可实现复制表单元素. 查看演示 下载源码 HTML 本文我们通过实例介绍一款简单的基于jQuery的元素复制插件,通过调用该插件轻松实现元素复制功能. 首先载入jQuery库文件和元素复制插件duplicateElement.min.js. <script sr

html5 开发的的俄罗斯方块实例源码

我们先来看看效果图: 开发的的俄罗斯方块实例源码-thinkphp开发实例源码"> 上面的数字是得分,游戏没有考虑兼容性,只在chrome上测试过,不过大部分现代浏览器还是可以玩的. 先上HTML代码 <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>俄罗斯方块</title>     <style type

jQuery实现产品对比功能附源码下载_jquery

产品对比相信大家并不陌生,为了方便用户对类似产品的相关信息进行有效直观的对比,一些电商网站产品或评测网站会为用户提供产品对比的功能,用户只需勾选多个需要对比的产品,就可以进行比对.本文将使用jQuery来给大家讲解如何实现产品对比功能. 查看演示     下载源码 HTML HTML结构我们分三部分,第一是产品列表部分,展示所有可以对比的产品.我们以某手机网站为例,简单的结构,只需展示产品图片和名称,以及一个添加按钮.注意我们把手机的相关参数信息都放在属性data-*里,等会后面展示对比信息的时

EasyUI实例源码

jQuery+EasyUI实例源码 http://www.51aspx.com/code/jQueryEasyUIExample   ASP.NET MVC+EF+EasyUI权限 http://www.51aspx.com/code/MVCEFAndEasyUI 注意用到了Respository仓储模式 博客园地址:http://www.cnblogs.com/hanyinglong/tag/权限/

ASP.Net C#2.0全能数据库组件 (含下载实例源码地址)

asp.net|数据|数据库|下载 /* ?--------------------------?   | Title: ASP.Net C#2.0全能数据库组件 (开源含实例源码)|   | Project: DBOperatorService.Data                    |   | Subarea: DataSet                                   |   | Author: ξ箫音ξ                           

webform-求一个asp.net 图片上传压缩实例源码

问题描述 求一个asp.net 图片上传压缩实例源码 求一个asp.net 图片上传压缩实例源码,在线等哇,求大神赐教 解决方案 http://download.csdn.net/detail/zr__manong/8325629 这个是我上传的资源 是ajax无刷新上传的代码 楼主看看是不是你需要的 解决方案二: Asp.NET压缩图片 建议是保留2张图片,一张缩略图,一张原始图片..压缩图片不清楚.如果你服务器配置好,可以保留原图,用动态页读取原始图片生成需要的缩略图 解决方案三: http