Skip to content
Snippets Groups Projects
Commit 4f50e736 authored by James Page's avatar James Page
Browse files

#29 Extend S3.UploadWithSettingsRevised to handle file path separately from file name

parent 9516fd56
Branches
Tags
1 merge request!32Resolve "Extend new S3.UploadWithSettingsRevised to handle file path and file name separately"
This commit is part of merge request !32. Comments created here will be created in the context of that merge request.
...@@ -32,8 +32,9 @@ type S3UploadSettings struct { ...@@ -32,8 +32,9 @@ type S3UploadSettings struct {
RetrieveSignedUrl bool RetrieveSignedUrl bool
ExpiryDuration *time.Duration // Used to set expiry datetime of download links. NB: does not affect deletion of object from S3 bucket. ExpiryDuration *time.Duration // Used to set expiry datetime of download links. NB: does not affect deletion of object from S3 bucket.
AddContentDisposition bool AddContentDisposition bool
FileName string FileName string // Used to specify the file name (excluding path) for content disposition; if FilePath is not present, it is used as the object key as well.
GenerateFileNameFromParts bool // Whether the file extension needs to be specified. If true, supply FilePrefix and FileExt. FilePath string // The complete file path (including name) used for the object key in S3.
GenerateFileNameFromParts bool // Whether the file extension needs to be specified. If true, supply FilePrefix and FileExt. Adds a UUID between the prefix and the extension.
FilePrefix string // Required when GenerateFileNameFromParts is true FilePrefix string // Required when GenerateFileNameFromParts is true
FileExt string // Required when GenerateFileNameFromParts is true FileExt string // Required when GenerateFileNameFromParts is true
} }
...@@ -154,22 +155,35 @@ func (s SessionWithHelpers) UploadWithSettings(data []byte, bucket, fileName str ...@@ -154,22 +155,35 @@ func (s SessionWithHelpers) UploadWithSettings(data []byte, bucket, fileName str
// UploadWithSettingsRevised can be renamed to UploadWithSettings once original function has been deprecated. // UploadWithSettingsRevised can be renamed to UploadWithSettings once original function has been deprecated.
func (s SessionWithHelpers) UploadWithSettingsRevised(data []byte, bucket string, settings S3UploadSettings) (S3UploadResponse, error) { func (s SessionWithHelpers) UploadWithSettingsRevised(data []byte, bucket string, settings S3UploadSettings) (S3UploadResponse, error) {
var fileName, uploadUrl string var fileName, filePath, uploadUrl string
// fileName is used as the object key in S3
if settings.FileName != "" { if settings.FileName != "" {
fileName = settings.FileName fileName = settings.FileName
} }
if settings.GenerateFileNameFromParts { if settings.GenerateFileNameFromParts {
fileName = fmt.Sprintf("%s_%s.%s", settings.FilePrefix, uuid.New().String(), settings.FileExt) fileName = fmt.Sprintf("%s_%s.%s", settings.FilePrefix, uuid.New().String(), settings.FileExt)
} }
if settings.FilePath != "" {
filePath = settings.FilePath
} else {
filePath = fileName
}
// Uploaded objects require a key
if fileName == "" {
return S3UploadResponse{}, errors.Error("no file name supplied for upload")
}
if settings.MimeType == "" { if settings.MimeType == "" {
settings.MimeType = getTypeForFilename(fileName) settings.MimeType = getTypeForFilename(fileName)
} }
putInput := &s3.PutObjectInput{ putInput := &s3.PutObjectInput{
Bucket: aws.String(bucket), Bucket: aws.String(bucket),
Key: aws.String(fileName), Key: aws.String(filePath),
ContentType: aws.String(string(settings.MimeType)), ContentType: aws.String(string(settings.MimeType)),
Body: bytes.NewReader(data), Body: bytes.NewReader(data),
} }
...@@ -187,14 +201,9 @@ func (s SessionWithHelpers) UploadWithSettingsRevised(data []byte, bucket string ...@@ -187,14 +201,9 @@ func (s SessionWithHelpers) UploadWithSettingsRevised(data []byte, bucket string
if settings.RetrieveSignedUrl { if settings.RetrieveSignedUrl {
var headers map[string]string var headers map[string]string
fileNameHeader := fileName
if settings.FileName != "" {
fileNameHeader = settings.FileName
}
if settings.AddContentDisposition { if settings.AddContentDisposition {
headers = map[string]string{ headers = map[string]string{
"content-disposition": "attachment; filename=\"" + fileNameHeader + "\"", "content-disposition": "attachment; filename=\"" + fileName + "\"",
} }
} }
...@@ -202,7 +211,8 @@ func (s SessionWithHelpers) UploadWithSettingsRevised(data []byte, bucket string ...@@ -202,7 +211,8 @@ func (s SessionWithHelpers) UploadWithSettingsRevised(data []byte, bucket string
if settings.ExpiryDuration != nil { if settings.ExpiryDuration != nil {
downloadUrlExpiry = *settings.ExpiryDuration downloadUrlExpiry = *settings.ExpiryDuration
} }
uploadUrl, err = s.GetSignedDownloadURL(bucket, fileName, downloadUrlExpiry, headers)
uploadUrl, err = s.GetSignedDownloadURL(bucket, filePath, downloadUrlExpiry, headers)
if err != nil { if err != nil {
return S3UploadResponse{}, err return S3UploadResponse{}, err
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment