109 lines
2.5 KiB
Go
109 lines
2.5 KiB
Go
package s3store
|
|
|
|
import (
|
|
"allapp-go/internal/config"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"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
|
|
}
|
|
|
|
func CopyObject(ctx context.Context, sourceKey string, targetKey string) error {
|
|
source := strings.ReplaceAll(url.PathEscape(fmt.Sprintf("%s/%s", bucket, sourceKey)), "%2F", "/")
|
|
|
|
_, err := S3Client.CopyObject(ctx, &s3.CopyObjectInput{
|
|
Bucket: aws.String(bucket),
|
|
CopySource: aws.String(source),
|
|
Key: aws.String(targetKey),
|
|
})
|
|
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
|
|
}
|