From 2a57ff9944a753a5d9f6f5a7855e9905dd72acda Mon Sep 17 00:00:00 2001 From: Joice Date: Mon, 19 Jul 2021 07:16:49 +0000 Subject: [PATCH] feat: Adds support for custom metadata (#13) * feat: Adds support for custom metadata assigning metadata for files will be beneficial to find files. ref: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-origin-custom-headers.html * fix: review suggestions by @rhnvrm - metadata moved to UploadInput as optional field. - changed x-amz-meta as constant - changed sprintf to simple string concat * FIX: changed amazon meta prefix changed variable name for amazon meta prefix to the top, prefix variable is exported. removed redundant comment for metadata --- simples3.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/simples3.go b/simples3.go index fb7867b..ed58590 100644 --- a/simples3.go +++ b/simples3.go @@ -25,6 +25,10 @@ import ( const ( securityCredentialsURL = "http://169.254.169.254/latest/meta-data/iam/security-credentials/" ) +const ( + // AMZMetaPrefix to prefix metadata key. + AMZMetaPrefix = "x-amz-meta-" +) // S3 provides a wrapper around your S3 credentials. type S3 struct { @@ -55,6 +59,7 @@ type UploadInput struct { // optional fields ContentDisposition string ACL string + CustomMetadata map[string]string // Setting key/value pairs adds user-defined metadata keys to the object, prefixed with AMZMetaPrefix. Body io.ReadSeeker } @@ -307,7 +312,8 @@ func (s3 *S3) FileUpload(u UploadInput) (UploadResponse, error) { if err != nil { return UploadResponse{}, err } - policies, err := s3.CreateUploadPolicies(UploadConfig{ + + uc := UploadConfig{ UploadURL: s3.getURL(u.Bucket), BucketName: u.Bucket, ObjectKey: u.ObjectKey, @@ -318,8 +324,18 @@ func (s3 *S3) FileUpload(u UploadInput) (UploadResponse, error) { MetaData: map[string]string{ "success_action_status": "201", // returns XML doc on success }, - }) + } + // Set custom metadata. + for k, v := range u.CustomMetadata { + if !strings.HasPrefix(k, AMZMetaPrefix) { + k = AMZMetaPrefix + k + } + + uc.MetaData[k] = v + } + + policies, err := s3.CreateUploadPolicies(uc) if err != nil { return UploadResponse{}, err }