feeder/cmd/s3.go

88 lines
2.2 KiB
Go

package cmd
import (
"bytes"
"net/http"
"os"
"path/filepath"
"strings"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func createS3Session() (*session.Session, error) {
// Create a single AWS session (we can re use this if we're uploading many files)
s, err := session.NewSession(&aws.Config{Region: aws.String(S3_REGION)})
if err != nil {
return nil, err
}
return s, nil
}
func uploadFile(session *session.Session, uploadFileDir, destination string) (string, error) {
var fileURL string
upFile, err := os.Open(uploadFileDir)
if err != nil {
return fileURL, err
}
defer upFile.Close()
upFileInfo, _ := upFile.Stat()
var fileSize = upFileInfo.Size()
fileBuffer := make([]byte, fileSize)
upFile.Read(fileBuffer)
fileType := filepath.Ext("uploadFileDir")
if fileType == "mp3" {
_, err = s3.New(session).PutObject(&s3.PutObjectInput{
Bucket: aws.String(S3_BUCKET),
Key: aws.String(destination),
ACL: aws.String("public-read"),
Body: bytes.NewReader(fileBuffer),
ContentLength: aws.Int64(fileSize),
ContentType: aws.String(http.DetectContentType(fileBuffer)),
ContentDisposition: aws.String("attachment"),
})
} else {
_, err = s3.New(session).PutObject(&s3.PutObjectInput{
Bucket: aws.String(S3_BUCKET),
Key: aws.String(destination),
ACL: aws.String("public-read"),
Body: bytes.NewReader(fileBuffer),
ContentLength: aws.Int64(fileSize),
ContentType: aws.String(http.DetectContentType(fileBuffer)),
})
}
if err != nil {
return fileURL, err
}
fileURL, err = getFileLink(session, destination)
if err != nil {
return fileURL, err
}
return fileURL, err
}
func getFileLink(s *session.Session, key string) (string, error) {
params := &s3.GetObjectInput{
Bucket: aws.String(S3_BUCKET),
Key: aws.String(key),
}
req, _ := s3.New(s).GetObjectRequest(params)
fullURL, err := req.Presign(5 * time.Minute) // Set link expiration time
if err != nil {
return fullURL, err
}
url := strings.Split(fullURL, "?")
return url[0], err
}