首页 > 编程语言 >Java开发中使用腾讯云OCR进行身份证识别与COS云存储实践

Java开发中使用腾讯云OCR进行身份证识别与COS云存储实践

时间:2024-08-14 12:27:14浏览次数:9  
标签:COS Java resp cosUploadVo 身份证 idCardOcrVo new OCR

文章目录


在Java开发中,处理身份证识别和云存储是一项常见的需求,尤其是在需要用户身份验证的应用场景中。今天,我想和大家分享一个实际的案例,展示如何利用腾讯云的OCR服务进行身份证识别,并将识别到的身份证信息上传到云存储中。

完整代码

以下是这个功能的完整实现代码:

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
@RequiredArgsConstructor
public class OcrServiceImpl implements OcrService {

    private final TencentCloudProperties tencentCloudProperties;

    private final CosService cosService;

    // 身份证识别
    @Override
    public IdCardOcrVo idCardOcr(MultipartFile file) {
        try {
            // 图片转换base64格式字符串
            byte[] base64 = Base64.encodeBase64(file.getBytes());
            String fileBase64 = new String(base64);

            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
            Credential cred = new Credential(tencentCloudProperties.getSecretId(),
                                             tencentCloudProperties.getSecretKey());
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            OcrClient client = new OcrClient(cred, tencentCloudProperties.getRegion(), clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            IDCardOCRRequest req = new IDCardOCRRequest();
            // 设置文件
            req.setImageBase64(fileBase64);

            // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应
            IDCardOCRResponse resp = client.IDCardOCR(req);

            // 转换为IdCardOcrVo对象
            IdCardOcrVo idCardOcrVo = new IdCardOcrVo();
            if (StringUtils.hasText(resp.getName())) {
                // 身份证正面
                idCardOcrVo.setName(resp.getName());
                idCardOcrVo.setGender("男".equals(resp.getSex()) ? "1" : "2");
                idCardOcrVo.setBirthday(
                        DateTimeFormat.forPattern("yyyy/MM/dd").parseDateTime(resp.getBirth()).toDate());
                idCardOcrVo.setIdcardNo(resp.getIdNum());
                idCardOcrVo.setIdcardAddress(resp.getAddress());

                // 上传身份证正面图片到腾讯云cos
                CosUploadVo cosUploadVo = cosService.upload(file, "idCard");
                idCardOcrVo.setIdcardFrontUrl(cosUploadVo.getUrl());
                idCardOcrVo.setIdcardFrontShowUrl(cosUploadVo.getShowUrl());
            } else {
                // 身份证反面
                // 证件有效期:"2010.07.21-2020.07.21"
                String idcardExpireString = resp.getValidDate().split("-")[1];
                idCardOcrVo.setIdcardExpire(
                        DateTimeFormat.forPattern("yyyy.MM.dd").parseDateTime(idcardExpireString).toDate());
                // 上传身份证反面图片到腾讯云cos
                CosUploadVo cosUploadVo = cosService.upload(file, "idCard");
                idCardOcrVo.setIdcardBackUrl(cosUploadVo.getUrl());
                idCardOcrVo.setIdcardBackShowUrl(cosUploadVo.getShowUrl());
            }
            return idCardOcrVo;
        } catch (Exception e) {
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }
    }
}
代码讲解

这个代码实现了身份证识别和图像上传的功能,核心步骤包括以下几个部分:

  1. 图片转换为Base64格式

    • 首先,将上传的MultipartFile文件转换为Base64格式的字符串。这是因为腾讯云的OCR API需要通过Base64字符串来传递图像数据。
    byte[] base64 = Base64.encodeBase64(file.getBytes());
    String fileBase64 = new String(base64);
    
  2. 实例化认证对象

    • 为了调用腾讯云的OCR API,需要先实例化Credential对象,传入腾讯云账户的SecretIdSecretKey
    Credential cred = new Credential(tencentCloudProperties.getSecretId(),
                                     tencentCloudProperties.getSecretKey());
    
  3. 配置HTTP选项

    • 配置HttpProfileClientProfile,用于自定义HTTP请求和客户端行为。比如设置OCR服务的访问端点。
    HttpProfile httpProfile = new HttpProfile();
    httpProfile.setEndpoint("ocr.tencentcloudapi.com");
    ClientProfile clientProfile = new ClientProfile();
    clientProfile.setHttpProfile(httpProfile);
    
  4. 发起OCR请求

    • 创建IDCardOCRRequest请求对象,将Base64格式的图像数据传递给OCR API,并通过OcrClient发起请求,获取身份证识别结果。
    IDCardOCRRequest req = new IDCardOCRRequest();
    req.setImageBase64(fileBase64);
    IDCardOCRResponse resp = client.IDCardOCR(req);
    
  5. 处理OCR结果

    • 根据OCR返回的结果,判断是身份证正面还是反面,并提取相关信息,如姓名、性别、生日、身份证号、有效期等。
    if (StringUtils.hasText(resp.getName())) {
        // 处理身份证正面信息
    } else {
        // 处理身份证反面信息
    }
    
  6. 图像上传到腾讯云COS

    • 将身份证图像上传到腾讯云COS,并将返回的URL保存到IdCardOcrVo对象中,供后续使用。
    CosUploadVo cosUploadVo = cosService.upload(file, "idCard");
    idCardOcrVo.setIdcardFrontUrl(cosUploadVo.getUrl());
    idCardOcrVo.setIdcardFrontShowUrl(cosUploadVo.getShowUrl());
    
  7. 异常处理

    • 捕获可能出现的异常,并抛出自定义的GuiguException异常,确保服务的稳定性和错误的可追踪性。
    catch (Exception e) {
        throw new GuiguException(ResultCodeEnum.DATA_ERROR);
    }
    
总结

通过这个实际案例,我们学习了如何结合腾讯云的OCR和COS服务,实现身份证识别与图像存储的功能。这种技术可以广泛应用于用户身份验证、实名认证等场景中,为应用的安全性和用户体验提供有力支持。希望这篇文章能为你的Java开发工作带来一些启发。

标签:COS,Java,resp,cosUploadVo,身份证,idCardOcrVo,new,OCR
From: https://blog.csdn.net/Takumilove/article/details/141187764

相关文章

  • Java 实现 B树(通俗易懂)
    目录一.概念二.节点定义三.插入操作1.查找位置2.插入3.分裂四.B+树和B*树1.B+树2.B*树一.概念B树是一颗多叉平衡树,空树也是多叉平衡树。一颗M阶的B树要满足以下条件:1.根节点至少有两个孩子;2.每个非根节点至少有(上取整)个关键字,至多有个关键字,并且以升序排列......
  • 【Python】MacOS安装ChromeDriver
    一、下载对应版本的chromedriver 二、解压后放到目录:/usr/local/bin目录 三、解决Mac无法验证Chromedriver开发者身份问题xattr-dcom.apple.quarantinechromedriver 四、验证安装结果#!/usr/bin/python3fromselenium.webdriverimportChromewebdriver=......
  • Java基础-学习笔记11
    11枚举、注解枚举枚举是一组常量的集合。可以这么理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。比如,Season类,只包含SPRING、SUMMER、AUTUMN、WINTER四个对象常量。两种实现方式(1)自定义类实现枚举     1)构造器私有化     2)本类内部创建一组对......
  • Java中封装的学习
    封装目录封装概念优点例子概念封装(encapsulation)是指对于某个对象,Java隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格......
  • java几种常见漏洞种类及处理方案
    一、SQLInjection(SQL注入漏洞)1.使用参数化查询(PreparedStatements)参数化查询是防止SQL注入最有效的方法之一。它确保用户输入的数据作为参数传递,而不是作为SQL命令的一部分。在Java中,可以使用PreparedStatement来实现这一点。示例代码:Stringsql="SELECT*FROMusers......
  • Java--抽象类与接口
    目录抽象类的概念1.什么是抽象(与具体类相对)2.为什么要抽象抽象类的好处抽象类和接口的区别抽象类的概念1.什么是抽象(与具体类相对)Java专门提供了一种机制,名为“抽象方法”。它属于一种不完整的方法,只含有一个声明,没有方法主体。下面是抽象方法声明时采用的语法:abstractvoidX......
  • Java--继承
    目录概念优缺点object类null概念由于封装,使得有共同特征的一类事物的所有描述信息都被归于一类之中,但我们知道,这并不是万能的,有些事物有共性,但还存在区别,比如码农,简单封装起来如下:优缺点优点:1、提高代码的维护性(只需要改动父类)。2、提高代码的复用性(共性的成员抽取到父类中......
  • [JAVA] 什么是多态?多态的使用和代码实现(超详细版)
    理解多态在JAVA中,多态是面向对象编程的重要特征之一,多态意味着在程序中同一个行为具有多种不同的表现形式。为了更好的理解多态的含义和使用方法,我们可以利用生活中的例子来帮助我们学习比如一些动物们都有跑,跳,吃等等的通用行为能力,不同的动物针对这些行为的表现形式是不同......
  • 深入理解 JavaScript 闭包
    前言在JavaScript中,闭包(Closure)是一个非常强大且常见的概念,它使得函数可以访问其外部作用域中的变量,即使在该函数外部作用域已经执行完毕的情况下。闭包广泛应用于回调函数、事件处理器、模块化编程等多个场景。本文将详细探讨闭包的定义、工作原理、常见应用场景以及潜在的陷......
  • 基于java的在线问卷调查系统的设计与实现
    @TOCspringboot145基于java的在线问卷调查系统的设计与实现第1章绪论**1.1课题背景二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。时代进步的标志,就是让人们过上更好的生活。在互联网诞生之前,地域位置往往是人们思想上......