home to your local SPACEGIRL 馃挮 arimelody.space
at dev 56 lines 1.3 kB view raw
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}