Skip to content

Instantly share code, notes, and snippets.

@cbess
Created June 16, 2021 01:36
Show Gist options
  • Save cbess/af42ae8f9aa4f6753b3b0e9f52b60eba to your computer and use it in GitHub Desktop.
Save cbess/af42ae8f9aa4f6753b3b0e9f52b60eba to your computer and use it in GitHub Desktop.
golang S3 upload module with gzip file compression
package uploader
import (
"bytes"
"compress/gzip"
"myapp/internal/config"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)
type UploadFileParams struct {
Compression string
Key string
Contents []byte
}
func UploadFile(params UploadFileParams) error {
cfg := config.AppConfig()
if cfg.BucketName == "" || params.Key == "" {
// no bucket or key, no upload attempted
return nil
}
sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String(cfg.StorageEndpoint),
})
if err != nil {
return err
}
body := params.Contents
// compress contents, if needed
if params.Compression == "gzip" {
body, err = compressBytes(body)
if err != nil {
return err
}
}
// upload to storage
uploader := s3manager.NewUploader(sess)
_, err = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(cfg.BucketName),
Key: aws.String(params.Key),
Body: bytes.NewReader(body),
})
if err != nil {
return err
}
return nil
}
func compressBytes(contents []byte) ([]byte, error) {
var buf bytes.Buffer
// compress bytes
zw := gzip.NewWriter(&buf)
_, err := zw.Write(contents)
if err != nil {
return nil, err
}
// close writer
if err := zw.Close(); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment