88 lines
2.2 KiB
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
|
|
}
|