home to your local SPACEGIRL 馃挮
arimelody.space
1package api
2
3import (
4 "arimelody-web/log"
5 "arimelody-web/model"
6 "bufio"
7 "encoding/base64"
8 "errors"
9 "fmt"
10 "os"
11 "path/filepath"
12 "strings"
13)
14
15func HandleImageUpload(app *model.AppState, data *string, directory string, filename string) (string, error) {
16 split := strings.Split(*data, ";base64,")
17 header := split[0]
18 imageData, err := base64.StdEncoding.DecodeString(split[1])
19 ext, _ := strings.CutPrefix(header, "data:image/")
20 directory = filepath.Join(app.Config.DataDirectory, directory)
21
22 switch ext {
23 case "png":
24 case "jpg":
25 case "jpeg":
26 default:
27 return "", errors.New("Invalid image type. Allowed: .png, .jpg, .jpeg")
28 }
29 filename = fmt.Sprintf("%s.%s", filename, ext)
30
31 // ensure directory exists
32 os.MkdirAll(directory, os.ModePerm)
33
34 imagePath := filepath.Join(directory, filename)
35 file, err := os.Create(imagePath)
36 if err != nil {
37 return "", err
38 }
39 defer file.Close()
40
41 // TODO: generate compressed versions of image (512x512?)
42
43 buffer := bufio.NewWriter(file)
44 _, err = buffer.Write(imageData)
45 if err != nil {
46 return "", nil
47 }
48
49 if err := buffer.Flush(); err != nil {
50 return "", nil
51 }
52
53 app.Log.Info(log.TYPE_FILES, "\"%s\" created.", imagePath)
54
55 return filename, nil
56}