fix uploading and img rendering
This commit is contained in:
parent
a0ccc5e120
commit
8e2d014317
@ -1,105 +0,0 @@
|
|||||||
package fileuploading
|
|
||||||
|
|
||||||
//sudo apt-get install libvips-tools
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/base64"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
"personalwebsite/wde"
|
|
||||||
"personalwebsite/webfilesystem"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/disintegration/imaging"
|
|
||||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
||||||
)
|
|
||||||
|
|
||||||
type FileUploading struct {
|
|
||||||
fs *webfilesystem.WebFileSystem
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewFileUploading(webfs *webfilesystem.WebFileSystem) *FileUploading {
|
|
||||||
return &FileUploading{
|
|
||||||
fs: webfs,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FileUploading) CreateMiniatures(parentDir string, file string) error {
|
|
||||||
src, err := imaging.Open(path.Join(parentDir, file))
|
|
||||||
if err != nil {
|
|
||||||
// log.Fatalf("failed to open image: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resize the cropped image to width = 200px preserving the aspect ratio.
|
|
||||||
src = imaging.Resize(src, 32, 0, imaging.Lanczos)
|
|
||||||
|
|
||||||
// Save the resulting image as JPEG.
|
|
||||||
splittedFileName := strings.Split(file, ".")
|
|
||||||
err = imaging.Save(src, path.Join(parentDir, splittedFileName[0]+"_32px."+splittedFileName[1]))
|
|
||||||
if err != nil {
|
|
||||||
// log.Fatalf("failed to save image: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
data, err := os.ReadFile(path.Join(parentDir, file))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
min32Data, err := os.ReadFile(path.Join(parentDir, splittedFileName[0]+"_32px."+splittedFileName[1]))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
imgData := wde.Img{
|
|
||||||
Header: "",
|
|
||||||
Data: data,
|
|
||||||
Miniature32: min32Data,
|
|
||||||
}
|
|
||||||
newFile := webfilesystem.WebFSFile{
|
|
||||||
MongoId: primitive.NewObjectID(),
|
|
||||||
Name: file,
|
|
||||||
Type: "picture",
|
|
||||||
Data: imgData,
|
|
||||||
Icon: "",
|
|
||||||
}
|
|
||||||
f.fs.CreateFile(&newFile, "/home/user/")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FileUploading) EncodeToBase64(path string) (string, string) {
|
|
||||||
// Read the entire file into a byte slice
|
|
||||||
bytes, err := ioutil.ReadFile(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var base64Encoding string
|
|
||||||
|
|
||||||
// Determine the content type of the image file
|
|
||||||
mimeType := http.DetectContentType(bytes)
|
|
||||||
|
|
||||||
// Prepend the appropriate URI scheme header depending
|
|
||||||
// on the MIME type
|
|
||||||
switch mimeType {
|
|
||||||
case "image/jpeg":
|
|
||||||
base64Encoding += "image/jpeg;base64"
|
|
||||||
case "image/png":
|
|
||||||
base64Encoding += "image/png;base64"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append the base64 encoded output
|
|
||||||
// base64Encoding += toBase64(bytes)
|
|
||||||
|
|
||||||
// Print the full base64 representation of the image
|
|
||||||
fmt.Println(base64Encoding)
|
|
||||||
return base64Encoding, toBase64(bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
func toBase64(b []byte) string {
|
|
||||||
return base64.StdEncoding.EncodeToString(b)
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
package wde
|
package libs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
@ -12,18 +12,6 @@ type ImagLib struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ReadImage(img *webfilesystem.WebFSFile) (*Img, error) {
|
func ReadImage(img *webfilesystem.WebFSFile) (*Img, error) {
|
||||||
// header, ok := img.Data.(primitive.D).Map()["header"].(string)
|
|
||||||
// if !ok {
|
|
||||||
// return nil, errors.New("error in file decoding")
|
|
||||||
// }
|
|
||||||
// base64, ok := img.Data.(primitive.D).Map()["base64"].(string)
|
|
||||||
// if !ok {
|
|
||||||
// return nil, errors.New("error in file decoding")
|
|
||||||
// }
|
|
||||||
// base64min32, ok := img.Data.(primitive.D).Map()["base64min32"].(string)
|
|
||||||
// if !ok {
|
|
||||||
// return nil, errors.New("error in file decoding")
|
|
||||||
// }
|
|
||||||
data, ok := img.Data.(primitive.D).Map()["srcdata"]
|
data, ok := img.Data.(primitive.D).Map()["srcdata"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("error in file decoding")
|
return nil, errors.New("error in file decoding")
|
73
main.go
73
main.go
@ -7,7 +7,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"personalwebsite/fileuploading"
|
|
||||||
"personalwebsite/routewde"
|
"personalwebsite/routewde"
|
||||||
"personalwebsite/wde"
|
"personalwebsite/wde"
|
||||||
"personalwebsite/webfilesystem"
|
"personalwebsite/webfilesystem"
|
||||||
@ -25,7 +25,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
if err := godotenv.Load(); err != nil {
|
if err := godotenv.Load(); err != nil {
|
||||||
println("No .env file found")
|
println("No .env file found")
|
||||||
}
|
}
|
||||||
@ -67,7 +66,6 @@ func main() {
|
|||||||
|
|
||||||
webfs := webfilesystem.NewWebFileSystem(client, dBName, webFsCollection)
|
webfs := webfilesystem.NewWebFileSystem(client, dBName, webFsCollection)
|
||||||
webde := wde.NewWDE(webfs)
|
webde := wde.NewWDE(webfs)
|
||||||
fileUploading := fileuploading.NewFileUploading(webfs)
|
|
||||||
|
|
||||||
persPropsApp := personalprops.NewPersPropsApp(webfs)
|
persPropsApp := personalprops.NewPersPropsApp(webfs)
|
||||||
// finderApp := finder.FinderApplication{}
|
// finderApp := finder.FinderApplication{}
|
||||||
@ -82,58 +80,55 @@ func main() {
|
|||||||
appsStorage.Apps["img-viewer"] = &imgViewerApp
|
appsStorage.Apps["img-viewer"] = &imgViewerApp
|
||||||
appsStorage.Apps["blog-viewer"] = blogViewerApp
|
appsStorage.Apps["blog-viewer"] = blogViewerApp
|
||||||
|
|
||||||
router.POST("/upload", func(c *gin.Context) {
|
router.POST("/upload", func(ctx *gin.Context) {
|
||||||
|
path := ctx.Query("path")
|
||||||
|
if path == "" {
|
||||||
|
ctx.JSON(http.StatusBadRequest, "TODO") //TODO json error struct
|
||||||
|
return
|
||||||
|
}
|
||||||
// single file
|
// single file
|
||||||
file, _ := c.FormFile("file")
|
file, _ := ctx.FormFile("file")
|
||||||
|
// generateMins := c.Param("generateMins")
|
||||||
// log.Println(file.Filename)
|
// log.Println(file.Filename)
|
||||||
|
|
||||||
// Upload the file to specific dst.
|
// Upload the file to specific dst.
|
||||||
dst := "./test-img/" + file.Filename
|
dst := "./test-img/" + file.Filename
|
||||||
c.SaveUploadedFile(file, dst)
|
ctx.SaveUploadedFile(file, dst)
|
||||||
|
|
||||||
fileUploading.CreateMiniatures("./test-img/", file.Filename)
|
err := webfs.UploadFile(dst, path)
|
||||||
|
if err != nil {
|
||||||
|
ctx.String(http.StatusInternalServerError, "TODO") //TODO
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// webFsCollection.CreateMiniatures("./test-img/", file.Filename)
|
||||||
|
|
||||||
// webfs.CreateFile(&img, "/home/user/")
|
// webfs.CreateFile(&img, "/home/user/")
|
||||||
|
|
||||||
c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
|
ctx.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
|
||||||
})
|
|
||||||
|
|
||||||
router.GET("/testimg", func(c *gin.Context) {
|
|
||||||
|
|
||||||
// c.Data(200, "image/jpeg", data)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
system := router.Group("system")
|
system := router.Group("system")
|
||||||
{
|
{
|
||||||
imgLibGroup := system.Group("imglib")
|
libsGroup := system.Group("libs")
|
||||||
{
|
{
|
||||||
imgLibGroup.GET("get", func(ctx *gin.Context) {
|
imgLibGroup := libsGroup.Group("img")
|
||||||
path := ctx.Query("path")
|
{
|
||||||
if path == "" {
|
imgLibGroup.GET("get", func(ctx *gin.Context) {
|
||||||
ctx.JSON(http.StatusBadRequest, "TODO") //TODO json error struct
|
path := ctx.Query("path")
|
||||||
return
|
if path == "" {
|
||||||
}
|
ctx.JSON(http.StatusBadRequest, "TODO") //TODO json error struct
|
||||||
min := ctx.Query("min")
|
return
|
||||||
|
}
|
||||||
|
|
||||||
file, err := webfs.Read(path)
|
file, err := webfs.Read(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.JSON(http.StatusInternalServerError, "TODO") //TODO json error struct
|
ctx.String(http.StatusInternalServerError, "TODO") //TODO
|
||||||
return
|
}
|
||||||
}
|
|
||||||
|
|
||||||
img, err := wde.ReadImage(file)
|
ctx.Data(200, "image/jpeg", file.Data.(primitive.Binary).Data)
|
||||||
if err != nil {
|
})
|
||||||
ctx.JSON(http.StatusInternalServerError, "TODO") //TODO json error struct
|
}
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if min == "min32" {
|
|
||||||
ctx.Data(http.StatusOK, "image/jpeg", []byte(img.Miniature32))
|
|
||||||
} else {
|
|
||||||
ctx.Data(http.StatusOK, "image/jpeg", []byte(img.Data))
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
wdeGroup := system.Group("wde")
|
wdeGroup := system.Group("wde")
|
||||||
{
|
{
|
||||||
|
17
wde/wde.go
17
wde/wde.go
@ -1,6 +1,7 @@
|
|||||||
package wde
|
package wde
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"path"
|
||||||
"personalwebsite/webfilesystem"
|
"personalwebsite/webfilesystem"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@ -31,19 +32,23 @@ func (w *WDE) Render(path string) (gin.H, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *WDE) RenderFileTileView(path string) (gin.H, error) {
|
func (w *WDE) RenderFileTileView(directory string) (gin.H, error) {
|
||||||
list, err := w.fs.List(path)
|
list, err := w.fs.List(directory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, file := range list {
|
for _, file := range list {
|
||||||
switch file.Type {
|
switch file.Type {
|
||||||
case "directory":
|
case "directory":
|
||||||
file.Icon = "TODO"
|
file.Icon = "http://localhost:8080/system/libs/img/get?path=/wde/icons/macos9/folder.png" //FIXME
|
||||||
case "base64img":
|
case "jpeg":
|
||||||
file.Icon = "http://localhost:8080/system/imglib/get?path=/home/user/cat2-test.jpeg&min=min32"
|
fallthrough
|
||||||
|
case "png":
|
||||||
|
fallthrough
|
||||||
|
case "jpg":
|
||||||
|
file.Icon = "http://localhost:8080/system/libs/img/get?path=" + path.Join(directory, file.Name) //FIXME
|
||||||
default:
|
default:
|
||||||
file.Icon = "http://localhost:8080/system/imglib/get?path=/home/user/cat2-test.jpeg&min=min32"
|
file.Icon = "http://localhost:8080/system/libs/img/get?path=/wde/icons/macos9/about-me.png" //FIXME
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return gin.H{
|
return gin.H{
|
||||||
|
94
webfilesystem/fileuploading.go
Normal file
94
webfilesystem/fileuploading.go
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
package webfilesystem
|
||||||
|
|
||||||
|
//sudo apt-get install libvips-tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (fs *WebFileSystem) UploadFile(realFilepath string, path string) error {
|
||||||
|
file, err := os.ReadFile(realFilepath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
splittedPath := fs.SplitPath(realFilepath)
|
||||||
|
fileName := splittedPath[len(splittedPath)-1]
|
||||||
|
extension := fs.GetExtension(fileName)
|
||||||
|
|
||||||
|
switch extension {
|
||||||
|
case "jpg":
|
||||||
|
fallthrough
|
||||||
|
case "jpeg":
|
||||||
|
newFile := WebFSFile{
|
||||||
|
MongoId: primitive.NewObjectID(),
|
||||||
|
Name: fileName,
|
||||||
|
Type: "jpeg",
|
||||||
|
Data: file,
|
||||||
|
Icon: "",
|
||||||
|
}
|
||||||
|
err := fs.CreateFile(&newFile, path)
|
||||||
|
return err
|
||||||
|
case "png":
|
||||||
|
newFile := WebFSFile{
|
||||||
|
MongoId: primitive.NewObjectID(),
|
||||||
|
Name: fileName,
|
||||||
|
Type: "png",
|
||||||
|
Data: file,
|
||||||
|
}
|
||||||
|
err := fs.CreateFile(&newFile, path)
|
||||||
|
return err
|
||||||
|
default:
|
||||||
|
return errors.New("this filetype not allowed")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// func (fs *WebFileSystem) CreateMiniatures(parentDir string, file string) error {
|
||||||
|
// src, err := imaging.Open(path.Join(parentDir, file))
|
||||||
|
// if err != nil {
|
||||||
|
// // log.Fatalf("failed to open image: %v", err)
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Resize the cropped image to width = 200px preserving the aspect ratio.
|
||||||
|
// src = imaging.Resize(src, 32, 0, imaging.Lanczos)
|
||||||
|
|
||||||
|
// // Save the resulting image as JPEG.
|
||||||
|
// splittedFileName := strings.Split(file, ".")
|
||||||
|
// err = imaging.Save(src, path.Join(parentDir, splittedFileName[0]+"_32px."+splittedFileName[1]))
|
||||||
|
// if err != nil {
|
||||||
|
// // log.Fatalf("failed to save image: %v", err)
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
|
||||||
|
// data, err := os.ReadFile(path.Join(parentDir, file))
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
|
||||||
|
// min32Data, err := os.ReadFile(path.Join(parentDir, splittedFileName[0]+"_32px."+splittedFileName[1]))
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
// imgData := wde.Img{
|
||||||
|
// Header: "",
|
||||||
|
// Data: data,
|
||||||
|
// Miniature32: min32Data,
|
||||||
|
// }
|
||||||
|
// newFile := WebFSFile{
|
||||||
|
// MongoId: primitive.NewObjectID(),
|
||||||
|
// Name: file,
|
||||||
|
// Type: "picture",
|
||||||
|
// Data: imgData,
|
||||||
|
// Icon: "",
|
||||||
|
// }
|
||||||
|
// fs.CreateFile(&newFile, "/home/user/")
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func toBase64(b []byte) string {
|
||||||
|
// return base64.StdEncoding.EncodeToString(b)
|
||||||
|
// }
|
@ -159,6 +159,13 @@ func (fs *WebFileSystem) SplitPath(path string) []string {
|
|||||||
return resPath
|
return resPath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fs *WebFileSystem) GetExtension(filename string) string {
|
||||||
|
// extension := []string{}
|
||||||
|
splittedName := strings.Split(filename, ".")
|
||||||
|
|
||||||
|
return splittedName[len(splittedName)-1]
|
||||||
|
}
|
||||||
|
|
||||||
func (fs *WebFileSystem) GetParentPath(path string) string {
|
func (fs *WebFileSystem) GetParentPath(path string) string {
|
||||||
splittedPath := fs.SplitPath(path)
|
splittedPath := fs.SplitPath(path)
|
||||||
parentPath := strings.Join(splittedPath[:len(splittedPath)-1], "/")
|
parentPath := strings.Join(splittedPath[:len(splittedPath)-1], "/")
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package imgviewer
|
package imgviewer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"personalwebsite/wde"
|
"personalwebsite/libs"
|
||||||
"personalwebsite/webfilesystem"
|
"personalwebsite/webfilesystem"
|
||||||
"personalwebsite/websiteapp"
|
"personalwebsite/websiteapp"
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ func (p *ImgViewerApp) Render(path string, isMobile bool) (gin.H, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
data, err := wde.ReadImage(img)
|
data, err := libs.ReadImage(img)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ package personalprops
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"personalwebsite/wde"
|
"personalwebsite/libs"
|
||||||
"personalwebsite/webfilesystem"
|
"personalwebsite/webfilesystem"
|
||||||
"personalwebsite/websiteapp"
|
"personalwebsite/websiteapp"
|
||||||
|
|
||||||
@ -194,7 +194,7 @@ func (p *PersonalPropertiesApp) Render() (gin.H, error) {
|
|||||||
|
|
||||||
type HeaderIsland struct {
|
type HeaderIsland struct {
|
||||||
Name string
|
Name string
|
||||||
Icon *wde.Base64Img
|
Icon *libs.Base64Img
|
||||||
Info1 string
|
Info1 string
|
||||||
Info2 string
|
Info2 string
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user