@@ -5,19 +5,13 @@ import (
5
5
"context"
6
6
"crypto/rand"
7
7
"encoding/base64"
8
- "fmt"
9
8
"image"
10
- "image/gif"
11
- "image/jpeg"
12
- "image/png"
13
- "io"
14
- "strings"
9
+ _ "image/gif" // for image
10
+ _ "image/jpeg"
11
+ _ "image/png"
15
12
16
13
"github.com/minio/minio-go"
17
14
"github.com/pkg/errors"
18
- "golang.org/x/image/draw"
19
- "golang.org/x/sync/errgroup"
20
- "google.golang.org/grpc/grpclog"
21
15
22
16
"github.com/ProgrammingLab/prolab-accounts/infra/store"
23
17
)
@@ -38,172 +32,33 @@ func NewImageStore(ctx context.Context, cli *minio.Client, bucket string) store.
38
32
}
39
33
40
34
func (s * imageStoreImpl ) CreateImage (img []byte ) (filename string , err error ) {
41
- name , err := generateFilename ()
42
- if err != nil {
43
- return "" , errors .WithStack (err )
44
- }
45
35
r := bytes .NewReader (img )
46
- return s .createImage (name , r )
47
- }
48
-
49
- func (s * imageStoreImpl ) DeleteImage (filename string ) error {
50
- err := s .cli .RemoveObject (s .bucketName , filename )
51
- return errors .WithStack (err )
52
- }
53
-
54
- var (
55
- imageSizes = []int {
56
- 64 ,
57
- 128 ,
58
- 256 ,
59
- 512 ,
60
- }
61
- )
62
-
63
- func (s * imageStoreImpl ) MigrateImages () error {
64
- grpclog .Infoln ("image migration started" )
65
-
66
- doneCh := make (chan struct {})
67
- defer close (doneCh )
68
- n := 0
69
- keys := make (map [string ]struct {})
70
- for info := range s .cli .ListObjectsV2 (s .bucketName , "" , true , doneCh ) {
71
- key := info .Key
72
- keys [key ] = struct {}{}
73
- }
74
-
75
- for key := range keys {
76
- if strings .HasSuffix (key , "px" ) {
77
- continue
78
- }
79
-
80
- migrated := true
81
- for _ , px := range imageSizes {
82
- _ , ok := keys [filenameWithPx (key , px )]
83
- migrated = migrated && ok
84
- }
85
- if migrated {
86
- continue
87
- }
88
-
89
- err := s .migrateImage (key )
90
- if err != nil {
91
- return err
92
- }
93
- grpclog .Infof ("migrated %v" , key )
94
- n ++
95
- }
96
-
97
- grpclog .Infof ("migrated %v images!" , n )
98
-
99
- return nil
100
- }
101
-
102
- func (s * imageStoreImpl ) migrateImage (key string ) error {
103
- i := strings .LastIndex (key , "." )
104
- name := key [:i ]
105
- obj , err := s .cli .GetObjectWithContext (s .ctx , s .bucketName , key , minio.GetObjectOptions {})
106
- if err != nil {
107
- return errors .WithStack (err )
108
- }
109
- defer obj .Close ()
110
-
111
- _ , err = s .createImage (name , obj )
36
+ _ , ext , err := image .DecodeConfig (r )
112
37
if err != nil {
113
- return errors .WithStack (err )
38
+ return "" , errors .WithStack (err )
114
39
}
115
- return nil
116
- }
117
-
118
- func (s * imageStoreImpl ) createImage (name string , img io.Reader ) (filename string , err error ) {
119
- var buf bytes.Buffer
120
- tee := io .TeeReader (img , & buf )
121
- src , ext , err := image .Decode (tee )
40
+ name , err := generateFilename (ext )
122
41
if err != nil {
123
42
return "" , errors .WithStack (err )
124
43
}
125
44
126
- eg := errgroup.Group {}
127
-
128
- orgName := name + "." + ext
129
- eg .Go (func () error {
130
- opt := minio.PutObjectOptions {
131
- ContentType : "image/" + ext ,
132
- }
133
- _ , err := s .cli .PutObjectWithContext (s .ctx , s .bucketName , orgName , & buf , - 1 , opt )
134
- return errors .WithStack (err )
135
- })
136
-
137
- for _ , size := range imageSizes {
138
- px := size
139
- eg .Go (func () error {
140
- img := s .resize (src , px )
141
- err := s .putImage (img , filenameWithPx (name + "." + ext , px ), ext )
142
- return errors .WithStack (err )
143
- })
45
+ opt := minio.PutObjectOptions {
46
+ ContentType : "image/" + ext ,
144
47
}
145
-
146
- err = eg .Wait ()
48
+ _ , err = s .cli .PutObjectWithContext (s .ctx , s .bucketName , name , r , r .Size (), opt )
147
49
if err != nil {
148
- return "" , err
149
- }
150
- return orgName , nil
151
- }
152
-
153
- func (s * imageStoreImpl ) resize (src image.Image , size int ) image.Image {
154
- srcW , srcH := src .Bounds ().Dx (), src .Bounds ().Dy ()
155
- if srcW <= size && srcH <= size {
156
- return src
157
- }
158
-
159
- var (
160
- w int
161
- h int
162
- )
163
- // 長辺がsizeになるように比を変えずに縮小する
164
- if srcW < srcH {
165
- h = size
166
- w = srcW * size / srcH
167
- } else {
168
- w = size
169
- h = srcH * size / srcW
50
+ return "" , errors .WithStack (err )
170
51
}
171
52
172
- dst := image .NewRGBA (image .Rect (0 , 0 , w , h ))
173
- draw .CatmullRom .Scale (dst , dst .Bounds (), src , src .Bounds (), draw .Over , nil )
174
- return dst
53
+ return name , nil
175
54
}
176
55
177
- func (s * imageStoreImpl ) putImage (img image.Image , filename , ext string ) error {
178
- r , w := io .Pipe ()
179
- go func () {
180
- var err error
181
- defer func () {
182
- e := w .CloseWithError (err )
183
- if e != nil {
184
- grpclog .Error (e )
185
- }
186
- }()
187
- switch ext {
188
- case "gif" :
189
- err = errors .WithStack (gif .Encode (w , img , nil ))
190
- case "jpeg" :
191
- err = errors .WithStack (jpeg .Encode (w , img , nil ))
192
- case "png" :
193
- err = errors .WithStack (png .Encode (w , img ))
194
- default :
195
- err = errors .WithStack (image .ErrFormat )
196
- }
197
- }()
198
-
199
- opt := minio.PutObjectOptions {
200
- ContentType : "image/" + ext ,
201
- }
202
- _ , err := s .cli .PutObjectWithContext (s .ctx , s .bucketName , filename , r , - 1 , opt )
56
+ func (s * imageStoreImpl ) DeleteImage (filename string ) error {
57
+ err := s .cli .RemoveObject (s .bucketName , filename )
203
58
return errors .WithStack (err )
204
59
}
205
60
206
- func generateFilename () (string , error ) {
61
+ func generateFilename (ext string ) (string , error ) {
207
62
b := make ([]byte , 32 )
208
63
_ , err := rand .Read (b )
209
64
if err != nil {
@@ -212,9 +67,5 @@ func generateFilename() (string, error) {
212
67
213
68
res := base64 .RawURLEncoding .EncodeToString (b )
214
69
215
- return string (res ), nil
216
- }
217
-
218
- func filenameWithPx (filename string , px int ) string {
219
- return fmt .Sprintf ("%v_%vpx" , filename , px )
70
+ return string (res ) + "." + ext , nil
220
71
}
0 commit comments