Skip to content

Commit 888fbae

Browse files
committed
feat: 禁止同名文件覆盖
1 parent d2fbd11 commit 888fbae

File tree

5 files changed

+22
-2
lines changed

5 files changed

+22
-2
lines changed

internal/apiException/exceptions.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ var (
2424
FileNotImageError = NewError(200504, log.LevelInfo, "上传的文件不是图片")
2525
ResourceNotFound = NewError(200505, log.LevelInfo, "资源不存在")
2626
NoPermission = NewError(200506, log.LevelInfo, "权限不足")
27+
FileAlreadyExists = NewError(200507, log.LevelInfo, "该文件已存在")
2728
BucketNotFound = NewError(200508, log.LevelInfo, "存储桶不存在")
2829

2930
NotFound = NewError(200404, log.LevelWarn, http.StatusText(http.StatusNotFound))

internal/controllers/objectController/upload.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ func handleSingleUpload(
112112
// 上传文件
113113
objectKey := objectService.GenerateObjectKey(data.Location, name, ext)
114114
err = bucket.SaveObject(reader, objectKey)
115+
if errors.Is(err, oss.ErrFileAlreadyExists) {
116+
element.Error = apiException.FileAlreadyExists.Error()
117+
return element
118+
}
115119
if err != nil {
116120
element.Error = apiException.ServerError.Error()
117121
return element

pkg/oss/local.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,14 @@ func (p *LocalStorageProvider) SaveObject(reader io.ReadSeeker, objectKey string
3333
// 根据 objectKey 解析出文件的路径
3434
relativePath := filepath.Join(p.path, objectKey)
3535

36+
// 检查文件是否已经存在
37+
_, err := os.Stat(relativePath)
38+
if err == nil {
39+
return ErrFileAlreadyExists
40+
}
41+
3642
// 创建文件夹,如果文件夹不存在
37-
err := os.MkdirAll(filepath.Dir(relativePath), os.ModePerm)
43+
err = os.MkdirAll(filepath.Dir(relativePath), os.ModePerm)
3844
if err != nil {
3945
return err
4046
}

pkg/oss/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,6 @@ var (
3333
ErrResourceNotExists = errors.New("resource not exists")
3434
// ErrPathIsNotDir 路径不是目录
3535
ErrPathIsNotDir = errors.New("path is not dir")
36+
// ErrFileAlreadyExists 文件已存在
37+
ErrFileAlreadyExists = errors.New("file already exists")
3638
)

pkg/oss/s3.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/aws/aws-sdk-go-v2/aws"
1111
"github.com/aws/aws-sdk-go-v2/service/s3"
1212
"github.com/aws/aws-sdk-go-v2/service/s3/types"
13+
"github.com/aws/smithy-go"
1314
"github.com/gabriel-vasile/mimetype"
1415
)
1516

@@ -45,8 +46,14 @@ func (p *S3StorageProvider) SaveObject(reader io.ReadSeeker, objectKey string) e
4546
Key: aws.String(objectKey),
4647
Body: reader,
4748
ContentType: aws.String(mime.String()),
49+
IfNoneMatch: aws.String("*"),
4850
})
49-
51+
if err != nil {
52+
var ae smithy.APIError
53+
if errors.As(err, &ae) && ae.ErrorCode() == "PreconditionFailed" {
54+
return ErrFileAlreadyExists
55+
}
56+
}
5057
return err
5158
}
5259

0 commit comments

Comments
 (0)