fix version 1
This commit is contained in:
@@ -6,7 +6,9 @@ import (
|
||||
"io"
|
||||
"log"
|
||||
"mime/multipart"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"bsm/full/module/base/fts/internal/config"
|
||||
@@ -20,6 +22,9 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// bucketPattern bucket名称只允许字母、数字、下划线和中划线
|
||||
var bucketPattern = regexp.MustCompile(`^[A-Za-z0-9_-]{1,64}$`)
|
||||
|
||||
// Handler 上传文件
|
||||
func Handler(c *gin.Context) {
|
||||
var (
|
||||
@@ -40,6 +45,11 @@ func Handler(c *gin.Context) {
|
||||
infra.Response.Error(c, errcode.NewError(400, "参数错误"))
|
||||
return
|
||||
}
|
||||
// 校验 bucket 名称,避免非法字符导致本地路径穿越或写入任意对象存储桶
|
||||
if !bucketPattern.MatchString(bucket) {
|
||||
infra.Response.Error(c, errcode.NewError(400, "bucket参数错误"))
|
||||
return
|
||||
}
|
||||
// if !strings.Contains(provider, "local") {
|
||||
// log.Println("provider参数错误")
|
||||
// infra.Response.Error(c, errcode.NewError(400, "provider参数错误"))
|
||||
@@ -99,6 +109,8 @@ func Handler(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
if err := impl.DBService.Create(&record).Error; err != nil {
|
||||
// 落库失败时清理已写入的本地文件或对象存储对象,避免残留孤儿文件
|
||||
removeStoredFile(&record, bucket)
|
||||
infra.Response.Error(c, err)
|
||||
return
|
||||
}
|
||||
@@ -106,6 +118,20 @@ func Handler(c *gin.Context) {
|
||||
infra.Response.Success(c, record)
|
||||
}
|
||||
|
||||
// removeStoredFile 清理已落盘/已上传的文件。单条 INSERT 无需事务,落库失败时按记录回滚外部存储
|
||||
func removeStoredFile(record *models.FtsRecord, bucket string) {
|
||||
if record.LocalPath != "" {
|
||||
if err := os.Remove(record.LocalPath); err != nil {
|
||||
log.Printf("清理本地文件失败: %v\n", err)
|
||||
}
|
||||
}
|
||||
if record.OssPath != "" {
|
||||
if err := RemoveOssObject(bucket, record.OssPath); err != nil {
|
||||
log.Printf("清理对象存储文件失败: %v\n", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func chksum(fh *multipart.FileHeader) (string, error) {
|
||||
// 2. 打开文件读取内容
|
||||
file, err := fh.Open()
|
||||
|
||||
Reference in New Issue
Block a user