当前位置: 首页
AI教程
分钟搭建阿里云函数计算OCR智能识别小程序

分钟搭建阿里云函数计算OCR智能识别小程序

热心网友 时间:2026-06-16
转载

基于阿里云函数计算与支付宝小程序,构建了一套轻量级、可扩展的云端OCR识别工具。通过函数计算的事件驱动机制,实现图片上传、OCR文字识别及结果存储,支持按需伸缩与弹性运行,简化后端开发与运维。

借助支付宝小程序与函数计算的深度融合,只需十分钟即可搭建一个轻量级、可弹性扩展的云端OCR识别工具。听起来很有吸引力?接下来,逐步拆解整个实现流程。

背景介绍

小程序生态兴起后,轻量级应用开发成为众多开发者关注的焦点。同时,后端Serverless化的优势日益凸显——两者结合,能够快速构建高可用、具备弹性伸缩能力的小程序。本教程的目标明确:让函数计算初学者也能迅速上手,并切实感受到函数计算带来的便捷与效率。那么,开始动手实践吧。

关于函数计算
阿里云函数计算是一款事件驱动的全托管计算服务。你无需管理服务器等基础设施,只需编写代码并上传,函数计算便会自动准备计算资源,以弹性、可靠的方式运行代码。再加上函数计算与云端服务的无缝集成能力,开发者用少量代码即可串联多个服务,完成复杂功能,效率提升显著。

采用函数计算作为小程序后端,优势直观:

  • 开发与部署更高效:只需聚焦业务逻辑,仅需实现业务逻辑本身。
  • 应用稳定性与可用性更强:函数计算提供弹性、可靠的计算资源,具备根据流量自动伸缩的能力。
  • 节省系统资源:Serverless与云服务器的核心区别在于——云服务器需持续运行,而函数计算按需执行。即仅在有请求时运行函数,无请求时完全不消耗资源。

应用架构

fc_ocr_flow

整体流程如下:小程序客户端上传图片,通过HTTP trigger触发upload_ocr_image函数,该函数将文件上传至OSS;OSS存入新图片后,触发process_image函数,函数读取图片并调用OCR API进行文字识别与提取;最后将识别结果存储回OSS。小程序客户端再请求识别结果,通过HTTP trigger触发get_ocr_result函数,获取最终结果。

开发步骤

1. 开发准备

  • 在阿里云控制台获取SecretIdSecretKey
  • 开通函数计算服务,熟悉基本功能。
  • 开启OSS服务,创建两个bucket:一个用于存储上传的图片,另一个用于存储识别结果(本demo需要两个bucket)。
  • 开通OCR服务(提供免费试用次数:通用类图片文字识别),获取appcode和服务url,后续配置时会用到。
  • 在支付宝小程序开发平台,按示例创建应用:体验小程序Demo。

2. 编写函数

编写HTTP请求函数

函数计算可直接使用HTTP trigger触发,从而快速编写任意接口。这里需要两个接口:一个用于图片上传,另一个用于获取OCR结果。

图片上传接口的代码:

def upload_ocr_image(environ, start_response):
    '''upload ocr image function triggered by http request'''
    try:
        content = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ, keep_blank_values=True)
        for key in content.keys():
            image_binary = content.getvalue(key)
            auth = oss2.Auth(secret_id, secret_key)
            bucket = oss2.Bucket(auth, oss_endpoint, ocr_image_bucket)
            bucket.put_object(key, image_binary)
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        start_response(status, response_headers)
        return ['upload image success']
    except (ValueError):
        return ['upload_ocr_image failed']

获取OCR结果接口的代码:

def get_ocr_result(environ, start_response):
    '''get ocr result function triggered by http request'''
    try:
        request_body_size = int(environ.get('CONTENT_LENGTH', 0))
        request_body = environ['wsgi.input'].read(request_body_size)
        res_json = json.loads(request_body)
        auth = oss2.Auth(secret_id, secret_key)
        bucket = oss2.Bucket(auth, oss_endpoint, ocr_text_bucket)
        ocr_res = bucket.get_object(str(res_json['key'])).read()
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        start_response(status, response_headers)
        return [str(ocr_res).encode('utf8')]
    except (ValueError):
        return ['get_ocr_result failed']

编写OCR处理函数

使用OSS trigger,当有图片上传时自动触发OCR函数:

def process_image(event, context):
    ''' process image function triggered by OSS when a image file is uploaded '''
    evt = json.loads(event)
    evt = evt['events'][0]
    bucket_name = evt['oss']['bucket']['name']
    endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
    obj_key = evt['oss']['object']['key']
    logger.info('New image uploaded: ' + str(obj_key))
    creds = context.credentials
    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    image_data = bucket.get_object(obj_key).read()
    detect_word_list = detect_text(image_data)
    text_bucket = oss2.Bucket(auth, endpoint, ocr_text_bucket)
    text_bucket.put_object(obj_key + '_ocr.txt', ' '.join(detect_word_list).encode(encoding='UTF8'))
    return 'Processed image file success, text can be seen in the text bucket'

def detect_text(image_data):
    ''' 请求阿里云OCR Api '''
    encoded_image = base64.b64encode(image_data)
    detect_word_list = text_detect_api(encoded_image)
    logger.info("Detect word list : " + ' '.join(detect_word_list))
    return detect_word_list

def text_detect_api(encodestr):
    method = 'POST'
    bodys = {}
    bodys['img'] = encodestr
    bodys['prob'] = 'false'
    bodys['charInfo'] = 'false'
    bodys['rotate'] = 'false'
    bodys['table'] = 'false'
    post_data = json.dumps(bodys).encode(encoding='UTF8')
    request = urllib2.Request(ocr_api_url, post_data)
    request.add_header('Authorization', 'APPCODE ' + ocr_api_appcode)
    request.add_header('Content-Type', 'application/json; charset=UTF-8')
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    response = urllib2.urlopen(request, context=ctx)
    content = response.read()
    logger.info("text detection res: " + str(content))
    word_list = []
    words_info = json.loads(content)['prism_wordsInfo']
    for info in words_info:
        word_list.append(info['word'].encode('utf8'))
    return word_list

3. 编写支付宝小程序

在OCR识别代码中,分别对应upload_ocr_imageget_ocr_result两个函数的触发地址(可在函数控制台查看)。以下是小程序的核心代码片段:

// 选择并上传图片
attach() {
    my.chooseImage({
        chooseImage: 1,
        success: res => {
            const path = res.apFilePaths[0];
            console.log(path)
            var key = path
            my.uploadFile({
                url: '',
                fileType: 'image',
                fileName: key,
                filePath: path,
                success: (ret) => {
                    var start=new Date().getTime();
                    var n = 2000
                    while(true) {
                        if(new Date().getTime()- start > n) break;
                    }
                    var resKey = key + '_ocr.txt'
                    my.request({
                        url: '',
                        method: 'POST',
                        data: {key: resKey},
                        dataType: 'json',
                        success: function(Res) {
                            my.alert({ content: 'Get OCR Result = ' + Res.data});
                        },
                        fail: function(Res) {
                            my.alert({content: 'get ocr result fail:' + Res.errorMessage});
                        }
                    });
                },
            });
        },
    });
},

4. 部署函数

使用Fun工具部署函数。需编写函数部署的YAML文件,更多模板文件编写信息可参考Serverless Application Model。以下是YAML配置:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  test:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Policies:
        - AliyunOSSFullAccess # Managed Policy
        - AliyunLogFullAccess # Managed Policy
      LogConfig:
        Project: func-func-log
        Logstore: func-test
    ocr_extract:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: cloud_func_ocr.process_image
        Runtime: python2.7
        Timeout: 60
        MemorySize: 512
        CodeUri: './'
    upload_image:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: cloud_func_ocr.upload_ocr_image
        Runtime: python2.7
        Timeout: 60
        MemorySize: 512
        CodeUri: './'
        Events:
          http-trigger:
            Type: HTTP
            Properties:
              AuthType: ANONYMOUS
              Methods: ['GET', 'POST', 'PUT']
    get_ocr_result:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: cloud_func_ocr.get_ocr_result
        Runtime: python2.7
        Timeout: 60
        MemorySize: 512
        CodeUri: './'
        Events:
          http-trigger:
            Type: HTTP
            Properties:
              AuthType: ANONYMOUS
              Methods: ['GET', 'POST', 'PUT']

请务必替换cloud_func_ocr.py代码中<>内的内容为你自己的实际配置。然后在代码目录下运行命令$ fun deploy,即可一键部署函数。

5. 测试

运行小程序模拟器,上传一张图片,便能看到OCR识别结果。

img2

总结

尽管本示例较为简单,但已充分展示了支付宝小程序与函数计算结合的典型模式。通过简洁的开发步骤,即可快速构建弹性、高可用的云端小程序。当然,这仅是冰山一角,更多富有想象力的应用场景正等待你去探索。

来源:https://developer.aliyun.com/article/704745

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Claude Code 必知的14个高效工作流,让你的开发效率提升300%

Claude Code 必知的14个高效工作流,让你的开发效率提升300%

Claude Code 常用工作流 先分享几项核心判断:Claude Code 真正强大的地方,并非仅仅在于它能编写代码——而是它让“编码”这件事本身变得更加高效且可控。你大概率遇到过这类场景:接手一个陌生项目,花了一整天才能理清架构;线上出现报错,翻遍日志也找不到根本原因;想要重构遗留代码,又担心

时间:2026-07-09 17:49
阿里云通义AIGC平台完全指南:设计师AI生产力革命

阿里云通义AIGC平台完全指南:设计师AI生产力革命

一、写在前面:为什么设计师需要关注AIGC? 如果你还在手动一张一张制作海报、反复修改客户口中“感觉不对”的配色方案、为电商详情页准备几十张不同场景的产品图——那么你一定经历过这些痛点: 创意瓶颈:脑海中有画面,但手绘无法呈现 重复劳动:调整尺寸、更换背景、批量生成变体消耗了大量时间精力 成本焦虑:

时间:2026-07-09 16:48
零基础毕设代码二次开发:3文件定位法及Vue/Java修改对照表

零基础毕设代码二次开发:3文件定位法及Vue/Java修改对照表

每年一到毕业季,计算机专业的同学总会陷入一个共同的怪圈:从 GitHub 上扒下来一套代码,或者用 AI 生成一个项目,看起来挺完整的,可导师一句“加个筛选条件”或“换个页面颜色”,瞬间就懵了——不敢改,不会改,怕改崩。是不是很熟悉? 一、为什么AI生成的毕设代码你 "不敢改 "? 1 1 毕业生的三大

时间:2026-07-09 16:46
反向海淘订单系统:状态机与分布式事务实战设计

反向海淘订单系统:状态机与分布式事务实战设计

先分享一个反直觉的结论:反向海淘订单管理的真正挑战,往往不在于业务逻辑本身,而在于状态流转。一个订单的生命周期拉长到跨国运输,中间涉及的环节多、系统多、参与者多,状态稍有错乱就可能引发连锁事故。Taocarts团队在实践中踩了不少坑,最终沉淀下来的这套状态机与分布式事务方案,成功解决了这一复杂难题。

时间:2026-07-09 16:46
AI并未抢走程序员饭碗而是更新了编程菜单

AI并未抢走程序员饭碗而是更新了编程菜单

AI并未大规模替代程序员,而是改变了职业结构。重复性编码岗位需求下降35%至15%,而AIAgent开发等岗位需求激增187%。开发者焦虑从“被替代”转向“跟不上变化”,60%程序员已使用AI辅助编程。人的核心价值转向架构设计、技术决策和审查AI生成代码,AI技能带来16%薪资溢价。

时间:2026-07-09 16:46
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜