通過API介面實現圖片上傳

熱心的市民發表於2020-11-05

通過API介面實現圖片上傳

需求

近期在介面功能實現要求,實現一個API圖片上傳,補充商戶開戶後補充圖片資訊,用於管理人員稽核.

業務要求

  1. 圖片有多條,法人資訊,授權資訊,等 有必填圖片,有非必填圖片,檔案大小限制為2MB.
  2. 必填的圖片未上傳,則本次均不錄入資料庫.
  3. 圖片要求在一次確認後,稽核人員才能顯示.
  4. 需要進行相關得記錄,用於後續檢視.

詳細設計

為了滿足以上實現,有兩種實現方式

  1. 單個批量介面 所有的檔案通過一個介面批量上傳.
  2. 檔案單條上傳+確認上傳.

檔案大小在2MB,如果批量上傳,10個檔案就要20MB,耗時很長,而且會佔用頻寬,批量介面實現起來比較複雜,評估後,決定使用單條上傳+確認上傳兩步的方式.

流程圖

附件上傳:

在這裡插入圖片描述

附件確認:
確認介面

風險點和優化事項

  1. 重複多次上傳進行限制.
  2. 針對重複圖片,同批次進行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)
/


介面設計

一 附件上傳介面

請求報文:

引數名出現要求描述
bankMchtIdM(18)商戶號
batchIdM(32)檔案上傳批次號,用於檔案上傳確認
photoTypeM(2)上傳照片的型別(見字典6.5)
photoMBase64編碼的照片,將編碼後的****+*替換成*-****

二 .附件確認

請求報文:

引數名出現要求描述
bankMchtIdM(18)商戶號
batchIdM(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

相關文章