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;
}
}