Django调用阿里OCR身份识别验证的Image编码小问题

Django调用阿里OCR身份识别验证中Image编码的小问题

目前正在做的一个项目,打算在里面添加身份证图像识别,直接获取用户的姓名,生日,性别这些基本信息。所以采用了阿里的OCR的API,阿里的API要求传入的image必须为base64编码过得数值,要通过base64编码,首先要转为二进制。而我通过前端传进来的FILE对象为InMemoryUploadedFile对象。它无法直接通过bytes()转换类型,而是要通过InMemoryUploadedFile中文件属性来读取。

出现的问题:

base64所需的是二进制数据,而不是InMemoryUploadedFile对象!

解决方案

InMemoryUploadedFile拥有的一些属性:

image = request.data.get('image')

image.file, image.field_name, image.name, image.content_type,image.size, image.charset, image.content_type_extra

我要获取二进制的数据,主要通过image.file.read(),也就是以文件对象的方式read()出二进制数据。

获取其二进制数据后,我就可以对其进行base64编码。

以下的例子是我前端加后端实现身份证识别

后端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
class ocr_id_card:
"""阿里api身份证识别"""

AppCode = #你的appcode
url = 'https://dm-51.data.aliyun.com/rest/160601/ocr/ocr_idcard.json'

params = {
'image': None,
'configure': {},
}

headers = {
'Authorization': 'APPCODE 你的appcode', # APPCODE +你的appcod,一定要有空格!
'Content-Type': 'application/json; charset=UTF-8' # 根据接口的格式来
}

def __init__(self, image, card_type):
image = str(base64.b64encode(image), encoding='utf-8')
configure = {"side": card_type}
self.params.update({'image': image, 'configure': configure})
self.json_result = None
self.card_type = card_type

"""def test(self, card_type):
path = 'C:\\Users\\ASUS\\Desktop\\index.jpg'
with open(path, 'rb') as f:
data = f.read()
image = str(base64.b64encode(data), encoding='utf-8')
configure = {"side": card_type}
self.body.update({'image': image, 'configure': configure})"""

def get_posturl_result(self, card_type):
"""get result from aliyun api"""
try:
params = json.dumps(self.params).encode(encoding='utf-8')
req = urllib.request.Request(self.url, params, self.headers) # structure request
r = urllib.request.urlopen(req) # post request
result = r.read().decode('utf-8')
self.json_result = json.loads(result)
r.close()
except Exception as e:
consumer_logger.error(e)

def address(self):
"""get detail in dict"""
return self.json_result.pop('address')

def birth(self):
"""get birth in dict"""
return self.json_result.pop('birth')

def actual_name(self):
"""get name in dict"""
return self.json_result.pop('name')

def nationality(self):
"""get nationality in dict"""
return self.json_result.pop('nationality')

def id_card(self):
"""get id card in dict"""
return self.json_result.pop('num')

def sex(self):
"""get sex in dict"""
return self.json_result.pop('sex')

def is_success(self):
"""get status to check whether this request is success"""
return self.json_result.pop('success')


class Interface_identify:

def __init__(self, image, card_type):
self.user_instance = ocr_id_card(image, card_type)
self.user_instance.get_posturl_result(card_type)

def get_detail(self, infor_key):
func = getattr(self.user_instance, infor_key)
return func()

def is_success(self):
"""get status to check whether this request is success"""
has_result = True if self.user_instance.json_result else False
if has_result:
is_success = self.get_detail('is_success')
return is_success
else:
return False


前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

//身份证件正面上传
upload.render({
elem: '#face'
, headers:headers
, accept:'images'
, auto:false
, size:3000
, data:{'card_type':'face'}
, drag:true
, exts:'jpg|png|jpeg'
, bindAction:'#verified'
, field:'image'
, url: '/consumer/verificatio n-name-chsc-api/' //改成您自己的上传接口
, choose: function (obj) {
//预读本地文件示例,不支持ie8
obj.preview(function (index, file, result) {
$('#face').prop('src', result); //图片链接(base64)
});
}
, done: function (res) {
//如果上传失败
if (res.code === 21) {
layer.msg('认证成功!', {icon: 1, time: 1000, closeBtn: 0});
$(".step-2").children().children().css({'opacity':1});
window.location.href = '/consumer/personal_idcard';
}
else if (res.code === -21){
layer.msg('图像识别失败!', {icon: 2, time: 1200, closeBtn: 0});
}
else if(res.code === 500){
layer.msg('服务器无响应!', {icon: 2, time: 1200, closeBtn: 0});
}
$('#face').removeAttr('src');
//上传成功
}
, error: function () {
//演示失败状态,并实现重传
layer.msg('服务器无响应!', {icon: 2, time: 1200, closeBtn: 0});
$('#face').removeAttr('src');
}
});

//身份证件背面上传
upload.render({
elem: '#back'
, headers:headers
, accept:'images'
, size:3000
, data:{'card_type':'back'}
, exts:'jpg|png|jpeg'
, drag:true
, auto:false
, bindAction:'#verified'
, field:'image'
, url: '/consumer/verification-name-chsc-api/' //改成您自己的上传接口
, before: function (obj) {
//预读本地文件示例,不支持ie8
obj.preview(function (index, file, result) {
$('#face').attr('src', result); //图片链接(base64)
});
}
, done: function (res) {
//如果上传失败
if (res.code === 21) {
layer.msg('认证成功!', {icon: 1, time: 1000, closeBtn: 0});
$(".step-2").children().children().css({'opacity':1});
$("#verified").text('实名认证成功!');
}
else if (res.code === -21){
layer.msg('图像识别失败!', {icon: 2, time: 1200, closeBtn: 0});
}
else if(res.code === 500){
layer.msg('服务器无响应!', {icon: 2, time: 1200, closeBtn: 0});
}
$('#back').removeAttr('src');
//上传成功
}
, error: function () {
layer.msg('服务器无响应!', {icon: 2, time: 1200, closeBtn: 0});
$('#back').removeAttr('src');
}
});