Created
June 16, 2021 01:36
-
-
Save cbess/af42ae8f9aa4f6753b3b0e9f52b60eba to your computer and use it in GitHub Desktop.
golang S3 upload module with gzip file compression
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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