app上传图片以及识别身份证信息

app上传图片以及识别身份证信息

主要功能实现:1手机端拍照上传身份证照片到服务器,然后读取出身份证的信息。

前端:

//选择相册
			 var files=[];
			 var index=1;          
	              function getImage(){				
						var cmr = plus.camera.getCamera();
						cmr.captureImage(function(p){						 				
							plus.io.resolveLocalFileSystemURL(p, function(entry){
							var img_path = entry.toLocalURL();							
								upload(img_path);												
                              
							}, function(e){	
							alert("失败");						
							});
						}, function(e){						
						}, {filename:"_doc/camera/",index:1});
                 }
			 function upload(p){				   			 		 									
				var n=p.substr(p.lastIndexOf('/')+1);
				files.push({name:"uploadkey"/* +index */,path:p});	
				//开始上传
				start_upload();
											
			}
							
			function start_upload(imgobj){			
			  if(files.length<=0){
	              	plus.nativeUI.alert("没有添加上传文件!");
		           return;
	           }
	           var server="http://本地ip:8080/outStoreApp.do?actions=getImageBaseById";    
			   var wt=plus.nativeUI.showWaiting();
				var task=plus.uploader.createUpload(server,
					{method:"POST"},
					function(t,status){ //上传完成					
						if(status==200){
						  var tmpStr = t.responseText;							
							 var json = eval('('+tmpStr+')');							
							 var files2 = json.data;
							 $("#account1").val(files2.name);
							 $("#account2").val(files2.birthday);
							 $("#account3").val(files2.address);
							 $("#account4").val(files2.sex);
							 $("#account5").val(files2.nation);
							 $("#account6").val(files2.idNumber);																					
							plus.nativeUI.alert("识别成功");						
					// document.getElementById("upload").src=url;
							wt.close();
						}else{
							alert("失败");
							wt.close();
						}
					});
				
				task.addData("uid",getUid());
				for(var i=0;i<files.length;i++){
					var f=files[i];				
					task.addFile(f.path,{key:f.name});						
				}
				task.start();
			}
			
			function getUid(){
	          return Math.floor(Math.random()*100000000+10000000).toString();
             }

后端方法:

/**
	 * 接收base编码url
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 */
	public ActionForward getImageBaseById(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		try {
			String fix = ".jpg";//默认将突破置为jpg格式	
			String requestURI = request.getRealPath("/")+"upload"+File.separator;
			//1991   0522				
			File file = new File(requestURI + "1991"+File.separator+"0522"+File.separator);
			if (!file.exists()) {// 若文件目录不存在,则创建目录
				file.mkdirs();
			}
			int maxPostSize = 1 * 100 * 1024 * 1024; 
			MultipartRequest mr=null;
			//创建临时文件
			mr = new MultipartRequest(request, requestURI + "1991"+File.separator+"0522"+File.separator, maxPostSize, "GBK");
			
            Enumeration files = mr.getFileNames(); 
             String fileName = "";
			  String filePath = "";
		

			while (files.hasMoreElements()) { 
			fileName = (String) files.nextElement();  
			System.out.println("FileName============"+fileName);			
			//用此方法得到上传文件的真正的文件名,这里的fileName指文件输入类型的名称 
			filePath = mr.getFilesystemName(fileName); 
			System.out.println("FilePath============"+filePath); 
			//此方法得到一个文件对象,代表储存在服务器上的fileName文件 
			File f = mr.getFile(fileName);	
			//获取token		
			AuthAccessToken token = new AuthAccessToken();			
			Map<String, String> map = token.getIdCardInfo(f, "front");
			JSONObject jsonObject = new JSONObject();
			jsonObject.put("data", map);
			PrintWriter out = response.getWriter();
			out.print(jsonObject.toString());
			out.flush();
			if (null == f) 
			throw new ServletException("file is not exist"); 		
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

调用百度云实现识别身份证信息 注意token有效期一半为30天,请做好session缓存。

package com.lenovo.app.accesstoken;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import com.alibaba.fastjson.JSONObject;
import java.net.URL;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.web.multipart.MultipartFile;

import com.runqian.base4.util.Base64;

public class AuthAccessToken {
	
	 // Access_Token获取
	  private static final String ACCESS_TOKEN_HOST = "https://aip.baidubce.com/oauth/2.0/token?";
	  // 身份证识别请求URL
	  private static final String OCR_HOST = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?";
	  // apiKey
	  private static final String API_KEY ="自己key";
	 // secretKey
	  private static final String SECRET_KEY = "自己的secrey_key";
	
	//获取token
	
	public static String getAccessToken(){

        return getAuth(API_KEY, SECRET_KEY);
	}
	/**
     * 获取API访问token
     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
     * @param ak - 百度云官网获取的 API Key
     * @param sk - 百度云官网获取的 Securet Key
     * @return assess_token 示例:
     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
     */
    public static String getAuth(String ak, String sk) {
        // 获取token地址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try {
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("POST");
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.err.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
            /**
             * 返回结果示例
             */
            System.err.println("result:" + result);
            JSONObject jsonObject = JSONObject.parseObject(result.toString());
            String access_token = jsonObject.getString("access_token");
            return access_token;
        } catch (Exception e) {
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
        return null;
    }
    
    
    
    /**
     * 获取身份证识别后的数据
     * @param image2
     * @param idCardSide
     * @return
     */
    public static String getStringIdentityCard(File imageUrl, String idCardSide) {
      // 身份证OCR的http URL+鉴权token
      String OCRUrl = OCR_HOST+"access_token="+getAccessToken();
      System.out.println(OCRUrl);
      System.out.println("***************************************************");
      System.out.println(getAccessToken());
      // 对图片进行base64处理
      String image = encodeImageToBase64(imageUrl);
      // 请求参数
      String requestParam = "detect_direction=true&id_card_side="+idCardSide+"&image="+image;
    
      try {
        // 请求OCR地址
        URL url = new URL(OCRUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        // 设置请求方法为POST
        connection.setRequestMethod("POST");
    
        // 设置请求头
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        connection.setRequestProperty("apiKey", API_KEY);
        connection.setDoOutput(true);
        connection.getOutputStream().write(requestParam.getBytes(StandardCharsets.UTF_8));
        connection.connect();
    
        // 定义 BufferedReader输入流来读取URL的响应
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
        StringBuilder result = new StringBuilder();
        String inputLine;
        while ((inputLine = bufferedReader.readLine()) != null) {
          result.append(inputLine);
        }
        bufferedReader.close();
        return result.toString();
      } catch (Exception e) {
        e.printStackTrace();
        System.err.println("身份证OCR识别异常");
        return null;
      }
    }
    
    /**
     * 对图片url进行Base64编码处理
     * @param imageUrl
     * @return
     */
    public static String encodeImageToBase64(File imageUrl) {
      // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
      byte[] data = null;
      try {
        InputStream inputStream = new FileInputStream(imageUrl);
        data = new byte[inputStream.available()];
        inputStream.read(data);
        inputStream.close();
    
        // 对字节数组Base64编码
        return URLEncoder.encode(Base64.byteArrayToBase64(data), "UTF-8");
      } catch (Exception e) {
        e.printStackTrace();
        return null;
      }
    
    }
    
    /**
     * 提取OCR识别身份证有效信息
     * @param
     * @return
     */
    public static Map<String, String> getIdCardInfo(File image, String idCardSide) {
      String value = getStringIdentityCard(image, idCardSide);
      String side;
      if (idCardSide == "1") {
        side = "正面";
      }else {
        side = "背面";
      }
      Map<String, String> map = new HashMap<>();
      JSONObject jsonObject = JSONObject.parseObject(value);
      JSONObject words_result = jsonObject.getJSONObject("words_result");
      if (words_result == null || words_result.isEmpty()) {
       // throw new MyException("请提供身份证"+side+"图片");
         return null;
      }
      for (String key : words_result.keySet()) {
        JSONObject result = words_result.getJSONObject(key);
        String info = result.getString("words");
        switch (key) {
          case "姓名":
            map.put("name", info);
            break;
          case "性别":
            map.put("sex", info);
            break;
          case "民族":
            map.put("nation", info);
            break;
          case "出生":
            map.put("birthday", info);
            break;
          case "住址":
            map.put("address", info);
            break;
          case "公民身份号码":
            map.put("idNumber", info);
            break;
          case "签发机关":
            map.put("issuedOrganization", info);
            break;
          case "签发日期":
            map.put("issuedAt", info);
            break;
          case "失效日期":
            map.put("expiredAt", info);
            break;
        }
      }
      return map;
    
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值