add huibo ivyz4y27
This commit is contained in:
27
internal/shared/pdfvalidate/pdfvalidate.go
Normal file
27
internal/shared/pdfvalidate/pdfvalidate.go
Normal file
@@ -0,0 +1,27 @@
|
||||
// Package pdfvalidate 对「已解码的 PDF 二进制」做格式与尺寸校验(与 multipart 发往数据源的字节一致)
|
||||
package pdfvalidate
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// MaxAuthorizePDFBytes 授权类 PDF 大小上限(与汇博等对接约定一致)
|
||||
const MaxAuthorizePDFBytes = 500 * 1024
|
||||
|
||||
var pdfMagic = []byte("%PDF-")
|
||||
|
||||
// ValidateDecodedPDFBinary 仅校验已通过 Base64 解码得到的原始字节:非空、长度、PDF 魔数头部。
|
||||
func ValidateDecodedPDFBinary(raw []byte) error {
|
||||
if len(raw) == 0 {
|
||||
return errors.New("授权书文件不能为空")
|
||||
}
|
||||
if len(raw) > MaxAuthorizePDFBytes {
|
||||
return fmt.Errorf("授权书文件不能超过500KB,当前大小: %d字节", len(raw))
|
||||
}
|
||||
if len(raw) < len(pdfMagic) || !bytes.Equal(raw[:len(pdfMagic)], pdfMagic) {
|
||||
return errors.New("授权书文件必须为PDF格式")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/go-playground/validator/v10"
|
||||
"tyapi-server/internal/shared/pdfvalidate"
|
||||
)
|
||||
|
||||
// RegisterCustomValidators 注册所有自定义验证器
|
||||
@@ -104,6 +105,9 @@ func RegisterCustomValidators(validate *validator.Validate) {
|
||||
// Base64编码格式验证器
|
||||
validate.RegisterValidation("base64", validateBase64)
|
||||
validate.RegisterValidation("validBase64", validateBase64)
|
||||
|
||||
// PDF 文件 Base64(与汇博授权书等场景一致:仅 PDF,≤500KB)
|
||||
validate.RegisterValidation("validBase64PDF", validateBase64PDF)
|
||||
}
|
||||
|
||||
// validatePhone 手机号验证
|
||||
@@ -1037,3 +1041,16 @@ func validateBase64(fl validator.FieldLevel) bool {
|
||||
_, err := base64.StdEncoding.DecodeString(base64Str)
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// validateBase64PDF:先将入参当作 Base64 解码为二进制,再对二进制做 PDF 校验(与发往数据源的逻辑一致)。
|
||||
func validateBase64PDF(fl validator.FieldLevel) bool {
|
||||
base64Str := strings.TrimSpace(fl.Field().String())
|
||||
if base64Str == "" {
|
||||
return true
|
||||
}
|
||||
decoded, err := base64.StdEncoding.DecodeString(base64Str)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return pdfvalidate.ValidateDecodedPDFBinary(decoded) == nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user