kuvia2/files.go

121 lines
2.9 KiB
Go

package main
import (
"bytes"
"context"
"fmt"
"github.com/flamego/flamego"
"github.com/flamego/session"
"github.com/flamego/template"
"github.com/minio/minio-go/v7"
"github.com/nfnt/resize"
"github.com/rs/zerolog/log"
"image"
"image/jpeg"
"math"
"net/http"
"os"
"strconv"
"time"
)
type File struct {
ID int `db:"id"`
GalleryId int `db:"gallery_id"`
Path string `db:"path"`
PathOrginalSize string `db:"path_orginal"`
}
func uploadImageForm(t template.Template, data template.Data , s session.Session, c flamego.Context) {
id := c.Request().FormValue("id")
if id == "" {
return
}
data["id"] = id
data["active"] = "upload"
t.HTML(http.StatusOK, "file_upload")
}
/*
Something foobar das gibt es doch nicht
*/
func uploadImage(c flamego.Context, s session.Session) {
//todo: check if loggedin
//todo: check if gllery is owned by uploader
file, fileHeader, err := c.Request().FormFile("file")
if err != nil {
panic(err)
}
defer file.Close()
galleryIdString := c.Request().FormValue("id")
galleryId, err := strconv.Atoi(galleryIdString)
if err != nil {
panic(err)
}
path := fmt.Sprintf("/gallery/%v/%v/data/%v-%v", s.Get("user_id"), galleryId, time.Now().UnixNano(), fileHeader.Filename)
pathOrignal := fmt.Sprintf("/gallery/%v/%v/data/%v-%v", s.Get("user_id"), galleryId, time.Now().UnixNano(), fileHeader.Filename)
imgO, _ , err := image.Decode(file)
if err != nil {
panic(err)
}
newImage := imgO
x := math.Max(float64(imgO.Bounds().Dx()), float64(imgO.Bounds().Dy()))
if x > 1500 {
if imgO.Bounds().Dx() > imgO.Bounds().Dy() {
newImage = resize.Resize(1200, 0, imgO, resize.Lanczos3)
} else {
newImage = resize.Resize(0, 1200, imgO, resize.Lanczos3)
}
pathOrignal = fmt.Sprintf("/gallery/%v/%v/data/%v-o-%v", s.Get("user_id"), galleryId, time.Now().UnixNano(), fileHeader.Filename)
uploadImageToS3(imgO, pathOrignal)
}
info, err := uploadImageToS3(newImage, path)
if err != nil {
panic(err)
}
_, err = sqlConnection.NamedExec("INSERT INTO `images` (gallery_id, path, path_orginal) VALUES (:gallery, :path, :path_orginal)", map[string]interface{}{
"gallery": galleryId,
"path": info.Key,
"path_orginal": pathOrignal,
})
if err != nil {
err2 := s3.RemoveObject(context.Background(), os.Getenv("S3_BUCKET"), info.Key, minio.RemoveObjectOptions{})
if err2 != nil {
log.Warn().Err(err).Msg("Cant remove Unused File from s3 stroage")
}
panic(err)
}
c.ResponseWriter().Write([]byte("ok"))
}
func uploadImageToS3(img image.Image, path string) (minio.UploadInfo, error) {
buf := new(bytes.Buffer)
//err := png.Encode(buf, img)
o := jpeg.Options{
Quality: 100,
}
err := jpeg.Encode(buf, img, &o)
if err != nil {
return minio.UploadInfo{}, err
}
//send_s3 := buf.Bytes()
info, err := s3.PutObject(context.Background(), os.Getenv("S3_BUCKET"), path, buf, -1, minio.PutObjectOptions{})
return info, err
}