-
Notifications
You must be signed in to change notification settings - Fork 0
/
s3_images_compressor.go
109 lines (87 loc) · 2.67 KB
/
s3_images_compressor.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
101
102
103
104
105
106
107
108
109
package main
import (
"log"
"os"
"os/exec"
"strings"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)
func main() {
aws_session := session.New(&aws.Config{Region: aws.String("eu-central-1")})
uploader := s3manager.NewUploader(aws_session)
downloader := s3manager.NewDownloader(aws_session)
bucket := os.Getenv("BUCKET_NAME")
svc := s3.New(aws_session)
result, err := svc.ListObjects(&s3.ListObjectsInput{Bucket: aws.String(bucket)})
if err != nil {
log.Println("Failed to load objects", err)
return
}
for _, file := range result.Contents {
key := aws.StringValue(file.Key)
size := aws.Int64Value(file.Size)
if size == 0 {
log.Printf("Create directory %s", key)
os.MkdirAll(key, 0700)
} else {
log.Printf("%s", key)
new_key := strings.Replace(key, ".JPG", "_new.JPG", 1)
downloadFile(downloader, bucket, key)
compressFile(key, new_key)
uploadFile(uploader, bucket, key, new_key)
}
}
}
func downloadFile(downloader *s3manager.Downloader, bucket string, key string){
file, err := os.Create(key)
if err != nil {
log.Println("Failed to create file", err)
}
defer file.Close()
numBytes, err := downloader.Download(file,
&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
log.Println("Failed to download file", err)
return
}
log.Println("Downloaded file", file.Name(), numBytes, "bytes")
}
func compressFile(key string, new_key string){
outfile, err := os.Create(new_key)
if err != nil {
log.Println("Failed to create file", err)
return
}
defer outfile.Close()
cmd := exec.Command(os.Getenv("CJPEG_PATH"), key)
cmd.Stdout = outfile
compile_err := cmd.Run()
if compile_err != nil {
log.Println("Failed to compress file", new_key, compile_err)
return
}
log.Println("Compressed file", key)
}
func uploadFile(uploader *s3manager.Uploader, bucket string, key string, new_key string) {
file, err := os.Open(new_key)
if err != nil {
log.Println("Failed to open file", err)
return
}
result, err := uploader.Upload(&s3manager.UploadInput{
Body: file,
Bucket: aws.String(bucket),
Key: aws.String(new_key),
})
if err != nil {
log.Println("Failed to upload", err)
return
}
log.Println("Successfully uploaded to", result.Location)
}