github.com/seeker-insurance/kit@v0.0.13/s3/s3.go (about) 1 package s3 2 3 import ( 4 "net/http" 5 "time" 6 7 "bytes" 8 "io" 9 "mime/multipart" 10 11 "github.com/aws/aws-sdk-go/aws" 12 "github.com/aws/aws-sdk-go/aws/credentials" 13 "github.com/aws/aws-sdk-go/aws/session" 14 "github.com/aws/aws-sdk-go/service/s3" 15 "github.com/aws/aws-sdk-go/service/s3/s3manager" 16 "github.com/seeker-insurance/kit/log" 17 "github.com/spf13/cobra" 18 "github.com/spf13/viper" 19 ) 20 21 var uploder *s3manager.Uploader 22 23 func UploadFromForm(fileHeader *multipart.FileHeader, key string) (*s3manager.UploadOutput, error) { 24 file, err := fileHeader.Open() 25 if err != nil { 26 return nil, err 27 } 28 29 var buffer bytes.Buffer 30 io.Copy(&buffer, file) 31 32 return Upload(buffer.Bytes(), key) 33 } 34 35 func Upload(b []byte, key string) (*s3manager.UploadOutput, error) { 36 37 fileBytes := bytes.NewReader(b) 38 fileType := http.DetectContentType(b) 39 40 params := &s3manager.UploadInput{ 41 Bucket: aws.String(viper.GetString("aws_bucket_name")), 42 Key: aws.String(key), 43 Body: fileBytes, 44 ContentType: aws.String(fileType), 45 } 46 47 return uploder.Upload(params) 48 } 49 50 // Presign presign s3 key fora given period of time 51 func Presign(key string, duration time.Duration) (string, error) { 52 svc := newS3Client() 53 req, _ := svc.GetObjectRequest(&s3.GetObjectInput{ 54 Bucket: aws.String(viper.GetString("aws_bucket_name")), 55 Key: &key, 56 }) 57 return req.Presign(duration) 58 } 59 60 func newS3Client() *s3.S3 { 61 awsAccessKey := viper.GetString("aws_access_key") 62 awsSecret := viper.GetString("aws_secret") 63 region := viper.GetString("aws_bucket_location") 64 65 creds := credentials.NewStaticCredentials(awsAccessKey, awsSecret, "") 66 _, err := creds.Get() 67 log.Check(err) 68 69 session, err := session.NewSession() 70 log.Check(err) 71 72 cfg := aws.NewConfig().WithRegion(region).WithCredentials(creds) 73 return s3.New(session, cfg) 74 } 75 76 func setUploader() { 77 uploder = s3manager.NewUploaderWithClient(newS3Client()) 78 } 79 80 func init() { 81 cobra.OnInitialize(setUploader) 82 }