通过API接口实现图片上传

3,477 阅读2分钟

通过API接口实现图片上传

需求

近期在接口功能实现要求,实现一个API图片上传,补充商户开户后补充图片信息,用于管理人员审核.

业务要求

  1. 图片有多条,法人信息,授权信息,等 有必填图片,有非必填图片,文件大小限制为2MB.
  2. 必填的图片未上传,则本次均不录入数据库.
  3. 图片要求在一次确认后,审核人员才能显示.
  4. 需要进行相关得记录,用于后续查看.

详细设计

为了满足以上实现,有两种实现方式

  1. 单个批量接口 所有的文件通过一个接口批量上传.
  2. 文件单条上传+确认上传.

文件大小在2MB,如果批量上传,10个文件就要20MB,耗时很长,而且会占用带宽,批量接口实现起来比较复杂,评估后,决定使用单条上传+确认上传两步的方式.

流程图

附件上传:

image-20201105233224291
image-20201105233224291

附件确认:

image-20201105234140188
image-20201105234140188

风险点和优化事项

  1. 重复多次上传进行限制.
  2. 针对重复图片,同批次进行MD5判断,如果已存在则不需要传入到内部的文件服务.

数据库表设计

image-20201105232421201
image-20201105232421201

​ MERCHANT_FILE_UPLOAD_BATCH 文件批次上传表

-- auto-generated definition
create table MERCHANT_FILE_UPLOAD_BATCH
(
    PKID         NUMBER not null
        constraint MERCHANT_FILE_UPLOAD_BATCH_PK
            primary key,
    OID_TRADERNO VARCHAR2(32),
    BATCH_ID     VARCHAR2(32),
    BATCH_STATUS VARCHAR2(32),
    CREATE_TIME  TIMESTAMP(6),
    UPDATE_TIME  TIMESTAMP(6),
    CONFIRM_TIME TIMESTAMP(6)
)
/

comment on column MERCHANT_FILE_UPLOAD_BATCH.OID_TRADERNO is '商户号'
/

comment on column MERCHANT_FILE_UPLOAD_BATCH.BATCH_ID is '商户批次号'
/

comment on column MERCHANT_FILE_UPLOAD_BATCH.BATCH_STATUS is '批次状态
CREATED
SUCCESS'
/

comment on column MERCHANT_FILE_UPLOAD_BATCH.CONFIRM_TIME is '确认时间'
/

create unique index BATCH_UN
    on MERCHANT_FILE_UPLOAD_BATCH (OID_TRADERNO, BATCH_ID)
/

create index BATCH_CREATE_TIME_INDEX
    on MERCHANT_FILE_UPLOAD_BATCH (CREATE_TIME)
/


MERCHANT_FILE_UPLOAD_RECORD 文件上传记录表

-- auto-generated definition
create table MERCHANT_FILE_UPLOAD_RECORD
(
    RECORD_ID    NUMBER not null
        constraint MERCHANT_FILE_UPLOAD_RECORD_PK
            primary key,
    OID_TRADERNO VARCHAR2(32),
    PHOTO_TYPE   VARCHAR2(64),
    PHOTO_SIZE   NUMBER(32),
    PHOTO_ID     VARCHAR2(256),
    CREATE_TIME  TIMESTAMP(6),
    UPDATE_TIME  TIMESTAMP(6),
    BATCH_ID     VARCHAR2(32),
    FILE_MD5     VARCHAR2(64)
)
/

comment on column MERCHANT_FILE_UPLOAD_RECORD.RECORD_ID is '主键id'
/

comment on column MERCHANT_FILE_UPLOAD_RECORD.OID_TRADERNO is '商户号'
/

comment on column MERCHANT_FILE_UPLOAD_RECORD.PHOTO_TYPE is '照片类型'
/

comment on column MERCHANT_FILE_UPLOAD_RECORD.PHOTO_SIZE is '照片大小,单位为字节'
/

comment on column MERCHANT_FILE_UPLOAD_RECORD.PHOTO_ID is '照片ID,返回的照片ID'
/

create index CREATE_TIME_INDEX
    on MERCHANT_FILE_UPLOAD_RECORD (CREATE_TIME)
/

create unique index MERCHANT_FILE_UPLOAD_UINDEX
    on MERCHANT_FILE_UPLOAD_RECORD (OID_TRADERNO, PHOTO_TYPE, BATCH_ID)
/

create index MD5__INDEX
    on MERCHANT_FILE_UPLOAD_RECORD (FILE_MD5)
/


接口设计

一 附件上传接口

请求报文:

参数名 出现要求 描述
bankMchtId M(18) 商户号
batchId M(32) 文件上传批次号,用于文件上传确认
photoType M(2) 上传照片的类型(见字典6.5)
photo M Base64编码的照片,将编码后的****+*替换成*-****

二 .附件确认

请求报文:

参数名 出现要求 描述
bankMchtId M(18) 商户号
batchId M(32) 文件上传批次号,用于文件上传确认

代码实现

碰到几个问题

  1. 图片转base64是需要把 *+*替换成*-*

    base64转码采用

    java.util.Base64

    编码:

    Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get("微信图片_20201104162519.jpg"))).replaceAll("\\+", "-")
    
    

    解码:

    Base64.getDecoder().decode(reqVO.getPhoto().replaceAll("-", "+")) 
    
  2. 图片超过2MB,被springboot自带的tomcat 限制无法正常上传.

    application.properties springboot 1.5.版本

    需要设置: server.tomcat.max-http-post-size=-1

参考文档:

  1. https://www.cnblogs.com/xyabk/p/9012612.html