Files
workspace/code/app/app-go/pkg/s3store/index.go
T
2026-05-07 21:34:09 +08:00

96 lines
2.1 KiB
Go

package s3store
import (
"allapp-go/internal/config"
"context"
"fmt"
"io"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/aws/aws-sdk-go-v2/service/s3/types"
)
var S3Client *s3.Client
var presignClient *s3.PresignClient
var bucket string
func NewS3Client(cfg *config.Config) {
credProvider := credentials.NewStaticCredentialsProvider(
cfg.AwsS3.AccessKey,
cfg.AwsS3.SecretKey,
"",
)
awsCfg := aws.Config{
Region: cfg.AwsS3.Region,
Credentials: credProvider,
}
S3Client = s3.NewFromConfig(awsCfg, func(o *s3.Options) {
o.BaseEndpoint = aws.String(cfg.AwsS3.Endpoint)
o.UsePathStyle = true
})
presignClient = s3.NewPresignClient(S3Client)
bucket = cfg.AwsS3.Bucket
fmt.Println("S3 client and Presign client initialized successfully!")
}
// UploadToRustFS 上传
func UploadToRustFS(ctx context.Context, file io.Reader, key string, size int64, contentType string) error {
_, err := S3Client.PutObject(ctx, &s3.PutObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: file,
ContentLength: aws.Int64(size),
ContentType: aws.String(contentType),
})
return err
}
// DeleteFromRustFS 删除
func DeleteFromRustFS(ctx context.Context, key string) error {
_, err := S3Client.DeleteObject(ctx, &s3.DeleteObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
return err
}
func DeleteBatch(ctx context.Context, keys []string) error {
const maxBatch = 1000
for i := 0; i < len(keys); i += maxBatch {
end := i + maxBatch
if end > len(keys) {
end = len(keys)
}
var objects []types.ObjectIdentifier
for _, k := range keys[i:end] {
objects = append(objects, types.ObjectIdentifier{
Key: aws.String(k),
})
}
_, err := S3Client.DeleteObjects(ctx, &s3.DeleteObjectsInput{
Bucket: aws.String(bucket),
Delete: &types.Delete{
Objects: objects,
Quiet: aws.Bool(false), // 返回删除结果(建议保留)
},
})
if err != nil {
return err // 整批失败才返回
}
}
return nil
}