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  }