通过API接口实现图片上传
需求
近期在接口功能实现要求,实现一个API图片上传,补充商户开户后补充图片信息,用于管理人员审核.
业务要求
- 图片有多条,法人信息,授权信息,等 有必填图片,有非必填图片,文件大小限制为2MB.
- 必填的图片未上传,则本次均不录入数据库.
- 图片要求在一次确认后,审核人员才能显示.
- 需要进行相关得记录,用于后续查看.
详细设计
为了满足以上实现,有两种实现方式
- 单个批量接口 所有的文件通过一个接口批量上传.
- 文件单条上传+确认上传.
文件大小在2MB,如果批量上传,10个文件就要20MB,耗时很长,而且会占用带宽,批量接口实现起来比较复杂,评估后,决定使用单条上传+确认上传两步的方式.
流程图
附件上传:
附件确认:
风险点和优化事项
- 重复多次上传进行限制.
- 针对重复图片,同批次进行MD5判断,如果已存在则不需要传入到内部的文件服务.
数据库表设计
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) | 文件上传批次号,用于文件上传确认 |
代码实现
碰到几个问题
图片转base64是需要把 *+*替换成*-*
base64转码采用
java.util.Base64
编码:
Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get("微信图片_20201104162519.jpg"))).replaceAll("\\+", "-")
解码:
Base64.getDecoder().decode(reqVO.getPhoto().replaceAll("-", "+"))
图片超过2MB,被springboot自带的tomcat 限制无法正常上传.
application.properties springboot 1.5.版本
需要设置: server.tomcat.max-http-post-size=-1
参考文档:
- https://www.cnblogs.com/xyabk/p/9012612.html