zhangqian
2023-08-29 e668092cf0bca471e665580c255c04a6ffc3cb8f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package upload
 
import (
    "errors"
    "fmt"
    "mime/multipart"
    "time"
 
    "srm/global"
 
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
    "go.uber.org/zap"
)
 
type AwsS3 struct{}
 
//@author: [WqyJh](https://github.com/WqyJh)
//@object: *AwsS3
//@function: UploadFile
//@description: Upload file to Aws S3 using aws-sdk-go. See https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-basic-bucket-operations.html#s3-examples-bucket-ops-upload-file-to-bucket
//@param: file *multipart.FileHeader
//@return: string, string, error
 
func (*AwsS3) UploadFile(file *multipart.FileHeader) (string, string, error) {
    session := newSession()
    uploader := s3manager.NewUploader(session)
 
    fileKey := fmt.Sprintf("%d%s", time.Now().Unix(), file.Filename)
    filename := global.GVA_CONFIG.AwsS3.PathPrefix + "/" + fileKey
    f, openError := file.Open()
    if openError != nil {
        global.GVA_LOG.Error("function file.Open() failed", zap.Any("err", openError.Error()))
        return "", "", errors.New("function file.Open() failed, err:" + openError.Error())
    }
    defer f.Close() // 创建文件 defer 关闭
 
    _, err := uploader.Upload(&s3manager.UploadInput{
        Bucket: aws.String(global.GVA_CONFIG.AwsS3.Bucket),
        Key:    aws.String(filename),
        Body:   f,
    })
    if err != nil {
        global.GVA_LOG.Error("function uploader.Upload() failed", zap.Any("err", err.Error()))
        return "", "", err
    }
 
    return global.GVA_CONFIG.AwsS3.BaseURL + "/" + filename, fileKey, nil
}
 
//@author: [WqyJh](https://github.com/WqyJh)
//@object: *AwsS3
//@function: DeleteFile
//@description: Delete file from Aws S3 using aws-sdk-go. See https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-basic-bucket-operations.html#s3-examples-bucket-ops-delete-bucket-item
//@param: file *multipart.FileHeader
//@return: string, string, error
 
func (*AwsS3) DeleteFile(key string) error {
    session := newSession()
    svc := s3.New(session)
    filename := global.GVA_CONFIG.AwsS3.PathPrefix + "/" + key
    bucket := global.GVA_CONFIG.AwsS3.Bucket
 
    _, err := svc.DeleteObject(&s3.DeleteObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(filename),
    })
    if err != nil {
        global.GVA_LOG.Error("function svc.DeleteObject() failed", zap.Any("err", err.Error()))
        return errors.New("function svc.DeleteObject() failed, err:" + err.Error())
    }
 
    _ = svc.WaitUntilObjectNotExists(&s3.HeadObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(filename),
    })
    return nil
}
 
// newSession Create S3 session
func newSession() *session.Session {
    sess, _ := session.NewSession(&aws.Config{
        Region:           aws.String(global.GVA_CONFIG.AwsS3.Region),
        Endpoint:         aws.String(global.GVA_CONFIG.AwsS3.Endpoint), //minio在这里设置地址,可以兼容
        S3ForcePathStyle: aws.Bool(global.GVA_CONFIG.AwsS3.S3ForcePathStyle),
        DisableSSL:       aws.Bool(global.GVA_CONFIG.AwsS3.DisableSSL),
        Credentials: credentials.NewStaticCredentials(
            global.GVA_CONFIG.AwsS3.SecretID,
            global.GVA_CONFIG.AwsS3.SecretKey,
            "",
        ),
    })
    return sess
}