aboutsummaryrefslogtreecommitdiff
path: root/internal/image/handler.go
diff options
context:
space:
mode:
authorMax Resnick <max@ofmax.li>2020-04-19 23:13:51 -0700
committerMax Resnick <max@ofmax.li>2020-05-21 22:24:27 -0700
commit4e77ad5762539d8f9edf40d2668a998c38e834d3 (patch)
tree91da3dfce1fa77ee04aa9045908f6142712d60f5 /internal/image/handler.go
parentff1a5122005017d729fea29ec86851609d2991b8 (diff)
downloadiserv-4e77ad5762539d8f9edf40d2668a998c38e834d3.tar.gz
post w/ some meta working
Diffstat (limited to '')
-rw-r--r--internal/image/handler.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/internal/image/handler.go b/internal/image/handler.go
new file mode 100644
index 0000000..8988a58
--- /dev/null
+++ b/internal/image/handler.go
@@ -0,0 +1,71 @@
+package image
+
+import (
+ "fmt"
+ "io/ioutil"
+ "log"
+ "net/http"
+)
+
+var fileTypes = map[string]string{
+ "image/jpeg": "jpg",
+ "image/png": "png",
+}
+
+// Handler image handler interface
+type Handler interface {
+ GetImage(w http.ResponseWriter, r *http.Request)
+ PostImage(w http.ResponseWriter, r *http.Request)
+}
+
+// NewHandler create image handler struct
+func NewHandler(service Servicer) Handler {
+ return &imageHandler{service}
+}
+
+type imageHandler struct {
+ service Servicer
+}
+
+func (h *imageHandler) GetImage(w http.ResponseWriter, r *http.Request) {
+ log.Print("serving image")
+ http.ServeFile(w, r, "foo.jpg")
+}
+
+// PostImage handler for creating an image post
+func (h *imageHandler) PostImage(w http.ResponseWriter, r *http.Request) {
+ // max size
+ r.ParseMultipartForm(10 << 20)
+ file, handler, err := r.FormFile("file")
+ if err != nil {
+ log.Printf("%s", err)
+ }
+ defer file.Close()
+ fileBytes, err := ioutil.ReadAll(file)
+ if err != nil {
+ log.Printf("%s", err)
+ log.Printf("unsupported filetype")
+ w.WriteHeader(400)
+ w.Write([]byte("Incorrect Content Type"))
+ return
+ }
+ fileType := http.DetectContentType(fileBytes)
+ if fileType != handler.Header.Get("Content-Type") {
+ log.Printf("file type and content type do not match")
+ w.WriteHeader(400)
+ w.Write([]byte("Incorrect Content Type"))
+ return
+ }
+ extension, exists := fileTypes[fileType]
+ if !exists {
+ log.Printf("unsupported filetype")
+ w.WriteHeader(400)
+ w.Write([]byte("Incorrect Content Type"))
+ return
+ }
+ fileID, err := h.service.NewID()
+ fileName := fmt.Sprintf("%s.%s", fileID, extension)
+ h.service.AddFile(fileName, fileBytes)
+ w.WriteHeader(201)
+ w.Write([]byte("ok"))
+}