98 lines
3.1 KiB
Go
98 lines
3.1 KiB
Go
package upload
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"mime/multipart"
|
|
"time"
|
|
|
|
"miniapp/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
|
|
}
|