package amazons3 import ( "bytes" "server/utility/oss" "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/s3manager" "github.com/gogf/gf/crypto/gmd5" "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" "github.com/gogf/gf/os/gfile" "github.com/gogf/gf/os/glog" "github.com/gogf/gf/os/gtime" "github.com/gogf/gf/util/grand" ) type AmazonS3Client struct{} func (c *AmazonS3Client) initSess() (*session.Session, error) { key := g.Config().GetString("aws.s3.key") secret := g.Config().GetString("aws.s3.secret") region := g.Config().GetString("aws.s3.region") if len(key) == 0 || len(secret) == 0 { return nil, gerror.New("aws s3 配置错误") } config := &aws.Config{ Region: aws.String(region), Credentials: credentials.NewStaticCredentials(key, secret, ""), } sess := session.Must(session.NewSession(config)) return sess, nil } func (c *AmazonS3Client) Upload(file interface{}) (string, error) { uploadFile, ok := file.(*ghttp.UploadFile) if !ok { return "", gerror.New("参数类型错误") } bucket := g.Config().GetString("aws.s3.bucket") if len(bucket) == 0 { glog.Warning("bucket为空:", bucket) return "", gerror.New("aws s3 配置错误") } sess, err := c.initSess() if err != nil { return "", err } uploader := s3manager.NewUploader(sess) f, err := uploadFile.Open() if err != nil { return "", err } defer f.Close() body := make([]byte, uploadFile.Size) _, err = f.Read(body) if err != nil { return "", err } key, err := gmd5.Encrypt(uploadFile.Filename + gtime.Datetime() + grand.Digits(6)) ext := gfile.Ext(uploadFile.Filename) if err != nil { return "", err } r, err := uploader.Upload(&s3manager.UploadInput{ Bucket: aws.String(bucket), Key: aws.String(key + ext), Body: bytes.NewReader(body), }) if err != nil { return "", err } return r.Location, nil } func (c *AmazonS3Client) UploadLocalFile(path, name string) (string, error) { bucket := g.Config().GetString("aws.s3.bucket") if len(bucket) == 0 { glog.Warning("bucket为空:", bucket) return "", gerror.New("aws s3 配置错误") } sess, err := c.initSess() if err != nil { return "", err } uploader := s3manager.NewUploader(sess) f, err := gfile.Open(path) if err != nil { return "", err } defer f.Close() body := make([]byte, gfile.Size(path)) _, err = f.Read(body) if err != nil { return "", err } r, err := uploader.Upload(&s3manager.UploadInput{ Bucket: aws.String(bucket), Key: aws.String(name), Body: bytes.NewReader(body), }) if err != nil { glog.Debug(err) return "", err } return r.Location, nil } func init() { oss.RegisterClient("amazon_s3", &AmazonS3Client{}) }