任务一完成
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
package upload
|
||||
|
||||
import (
|
||||
"context"
|
||||
"mime/multipart"
|
||||
"path"
|
||||
|
||||
"github.com/aws/aws-sdk-go-v2/aws"
|
||||
"github.com/aws/aws-sdk-go-v2/config"
|
||||
"github.com/aws/aws-sdk-go-v2/credentials"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
)
|
||||
|
||||
// AwsS3 AWS S3存储
|
||||
type AwsS3 struct {
|
||||
Bucket string
|
||||
Region string
|
||||
Endpoint string
|
||||
SecretID string
|
||||
SecretKey string
|
||||
BaseURL string
|
||||
PathPrefix string
|
||||
S3ForcePathStyle bool
|
||||
DisableSSL bool
|
||||
}
|
||||
|
||||
// NewAwsS3 创建AWS S3
|
||||
func NewAwsS3(bucket, region, endpoint, secretID, secretKey, baseURL, pathPrefix string, s3ForcePathStyle, disableSSL bool) *AwsS3 {
|
||||
return &AwsS3{
|
||||
Bucket: bucket,
|
||||
Region: region,
|
||||
Endpoint: endpoint,
|
||||
SecretID: secretID,
|
||||
SecretKey: secretKey,
|
||||
BaseURL: baseURL,
|
||||
PathPrefix: pathPrefix,
|
||||
S3ForcePathStyle: s3ForcePathStyle,
|
||||
DisableSSL: disableSSL,
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AwsS3) getClient(ctx context.Context) (*s3.Client, error) {
|
||||
cfg, err := config.LoadDefaultConfig(ctx,
|
||||
config.WithRegion(a.Region),
|
||||
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(a.SecretID, a.SecretKey, "")),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
|
||||
if a.Endpoint != "" {
|
||||
o.BaseEndpoint = aws.String(a.Endpoint)
|
||||
}
|
||||
o.UsePathStyle = a.S3ForcePathStyle
|
||||
})
|
||||
return client, nil
|
||||
}
|
||||
|
||||
// Upload 上传文件
|
||||
func (a *AwsS3) Upload(file *multipart.FileHeader) (string, string, error) {
|
||||
ctx := context.Background()
|
||||
client, err := a.getClient(ctx)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
// 生成文件名和路径
|
||||
fileName := GenerateFileName(file.Filename)
|
||||
filePath := GeneratePath(a.PathPrefix)
|
||||
key := path.Join(filePath, fileName)
|
||||
|
||||
// 打开文件
|
||||
src, err := file.Open()
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
defer src.Close()
|
||||
|
||||
// 上传
|
||||
contentType := file.Header.Get("Content-Type")
|
||||
_, err = client.PutObject(ctx, &s3.PutObjectInput{
|
||||
Bucket: aws.String(a.Bucket),
|
||||
Key: aws.String(key),
|
||||
Body: src,
|
||||
ContentType: aws.String(contentType),
|
||||
})
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
// 返回访问URL和key
|
||||
accessURL := a.BaseURL + "/" + key
|
||||
return accessURL, key, nil
|
||||
}
|
||||
|
||||
// Delete 删除文件
|
||||
func (a *AwsS3) Delete(key string) error {
|
||||
ctx := context.Background()
|
||||
client, err := a.getClient(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = client.DeleteObject(ctx, &s3.DeleteObjectInput{
|
||||
Bucket: aws.String(a.Bucket),
|
||||
Key: aws.String(key),
|
||||
})
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user