Skip to content

Commit 49ea59c

Browse files
author
Harsh Mangalam
committed
initial commit
0 parents  commit 49ea59c

File tree

4 files changed

+144
-0
lines changed

4 files changed

+144
-0
lines changed

go.mod

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module github.com/harshmangalam/fileserver
2+
3+
go 1.16
4+
5+
require (
6+
github.com/andybalholm/brotli v1.0.3 // indirect
7+
github.com/gofiber/fiber/v2 v2.13.0 // indirect
8+
github.com/google/uuid v1.2.0 // indirect
9+
github.com/klauspost/compress v1.13.1 // indirect
10+
github.com/valyala/fasthttp v1.27.0 // indirect
11+
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect
12+
)

go.sum

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
2+
github.com/andybalholm/brotli v1.0.3 h1:fpcw+r1N1h0Poc1F/pHbW40cUm/lMEQslZtCkBQ0UnM=
3+
github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
4+
github.com/gofiber/fiber/v2 v2.13.0 h1:jJBCPwq+hlsfHRDVsmfu6pbgW85Y8jL9dE+VmTzfE6I=
5+
github.com/gofiber/fiber/v2 v2.13.0/go.mod h1:oZTLWqYnqpMMuF922SjGbsYZsdpE1MCfh416HNdweIM=
6+
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
7+
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
8+
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
9+
github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
10+
github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ=
11+
github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
12+
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
13+
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
14+
github.com/valyala/fasthttp v1.26.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
15+
github.com/valyala/fasthttp v1.27.0 h1:gDefRDL9aqSiwXV6aRW8aSBPs82y4KizSzHrBLf4NDI=
16+
github.com/valyala/fasthttp v1.27.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
17+
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
18+
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
19+
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
20+
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
21+
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
22+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24+
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
25+
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
26+
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
27+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
28+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
29+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
30+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
4.35 KB
Loading

main.go

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
"strings"
8+
9+
"github.com/gofiber/fiber/v2"
10+
"github.com/gofiber/fiber/v2/middleware/cors"
11+
"github.com/google/uuid"
12+
)
13+
14+
func main() {
15+
// create new fiber instance and use across whole app
16+
app := fiber.New()
17+
18+
// middleware to allow all clients to communicate using http and allow cors
19+
app.Use(cors.New())
20+
21+
// serve images from images directory prefixed with /images
22+
// i.e http://localhost:4000/images/someimage.webp
23+
24+
app.Static("/images", "./images")
25+
26+
// handle image uploading using post request
27+
28+
app.Post("/", handleFileupload)
29+
30+
// delete uploaded image by providing unique image name
31+
32+
app.Delete("/:imageName", handleDeleteImage)
33+
34+
// start dev server on port 4000
35+
36+
log.Fatal(app.Listen(":4000"))
37+
}
38+
39+
func handleFileupload(c *fiber.Ctx) error {
40+
41+
// parse incomming image file
42+
43+
file, err := c.FormFile("image")
44+
45+
if err != nil {
46+
log.Println("image upload error --> ", err)
47+
return c.JSON(fiber.Map{"status": 500, "message": "Server error", "data": nil})
48+
49+
}
50+
51+
// generate new uuid for image name
52+
uniqueId := uuid.New()
53+
54+
// remove "- from imageName"
55+
56+
filename := strings.Replace(uniqueId.String(), "-", "", -1)
57+
58+
// extract image extension from original file filename
59+
60+
fileExt := strings.Split(file.Filename, ".")[1]
61+
62+
// generate image from filename and extension
63+
image := fmt.Sprintf("%s.%s", filename, fileExt)
64+
65+
// save image to ./images dir
66+
err = c.SaveFile(file, fmt.Sprintf("./images/%s", image))
67+
68+
if err != nil {
69+
log.Println("image save error --> ", err)
70+
return c.JSON(fiber.Map{"status": 500, "message": "Server error", "data": nil})
71+
}
72+
73+
// generate image url to serve to client using CDN
74+
75+
imageUrl := fmt.Sprintf("http://localhost:4000/images/%s", image)
76+
77+
// create meta data and send to client
78+
79+
data := map[string]interface{}{
80+
81+
"imageName": image,
82+
"imageUrl": imageUrl,
83+
"header": file.Header,
84+
"size": file.Size,
85+
}
86+
87+
return c.JSON(fiber.Map{"status": 201, "message": "Image uploaded successfully", "data": data})
88+
}
89+
90+
func handleDeleteImage(c *fiber.Ctx) error {
91+
// extract image name from params
92+
imageName := c.Params("imageName")
93+
94+
// delete image from ./images
95+
err := os.Remove(fmt.Sprintf("./images/%s", imageName))
96+
if err != nil {
97+
log.Println(err)
98+
return c.JSON(fiber.Map{"status": 500, "message": "Server Error", "data": nil})
99+
}
100+
101+
return c.JSON(fiber.Map{"status": 201, "message": "Image deleted successfully", "data": nil})
102+
}

0 commit comments

Comments
 (0)