/
main.go
100 lines (83 loc) · 2.08 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"bytes"
"context"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"golang.org/x/sync/errgroup"
)
const (
S3_REGION = "eu-west-1"
S3_BUCKET = "glacial-io"
)
func main() {
s, err := session.NewSession(&aws.Config{
Region: aws.String(S3_REGION),
Credentials: credentials.NewStaticCredentials(
"XXX",
"YYY",
""),
})
if err != nil {
log.Fatal(err)
}
err = uploadDirectoryToS3(s, ".")
if err != nil {
log.Fatal(err)
}
}
func uploadDirectoryToS3(s *session.Session, dirname string) error {
g, _ := errgroup.WithContext(context.Background())
var err1 error
files, err := ioutil.ReadDir(dirname)
if err != nil {
log.Fatal(err)
}
for _, file := range files {
if !file.IsDir() {
g.Go(uploadFileTos3(s, file.Name()))
}
}
// Wait for all files uploading -> s3 to complete.
if err1 = g.Wait(); err1 == nil {
fmt.Println("Successfully uploaded all files")
return nil
}
return err1
}
func uploadFileTos3(s *session.Session, fileName string) error {
// open the file for use
file, err := os.Open(fileName)
if err != nil {
return err
}
defer file.Close()
// get the file size and read
// the file content into a buffer
fileInfo, _ := file.Stat()
var size = fileInfo.Size()
buffer := make([]byte, size)
file.Read(buffer)
// config settings: this is where you choose the bucket,
// filename, content-type and storage class of the file
// you're uploading
e, s3err := s3.New(s).PutObject(&s3.PutObjectInput{
Bucket: aws.String(S3_BUCKET),
Key: aws.String(fileName),
ACL: aws.String("private"),
Body: bytes.NewReader(buffer),
ContentLength: aws.Int64(size),
ContentType: aws.String(http.DetectContentType(buffer)),
ContentDisposition: aws.String("attachment"),
ServerSideEncryption: aws.String("AES256"),
StorageClass: aws.String("INTELLIGENT_TIERING"),
})
return s3err
}