From 83236d846f825ac5a93748e6e08b6f94268fcc0d Mon Sep 17 00:00:00 2001 From: Stephen Searles Date: Fri, 23 Jun 2017 15:02:37 -0700 Subject: [PATCH] some ui features for uploading --- caddyhugo.go | 3 +++ media.go | 59 +++++++++++++++++++++++++++++++++++++++-- templates.go | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 2 deletions(-) diff --git a/caddyhugo.go b/caddyhugo.go index fc27f19..086decb 100644 --- a/caddyhugo.go +++ b/caddyhugo.go @@ -168,6 +168,9 @@ func (ch *CaddyHugo) ServeHTTPWithNext(next httpserver.Handler, c *caddy.Control if strings.HasPrefix(r.URL.Path, "/hugo/media") { return ch.serveMediaPage(w, r) } + if strings.HasPrefix(r.URL.Path, "/hugo/upload") { + return ch.uploadMedia(w, r) + } if strings.HasPrefix(r.URL.Path, "/media/") { return ch.serveMedia(w, r) } diff --git a/media.go b/media.go index 06e29e0..4053fab 100644 --- a/media.go +++ b/media.go @@ -3,7 +3,9 @@ package caddyhugo import ( "fmt" "image" + _ "image/gif" "image/jpeg" + _ "image/png" "io" "net/http" "os" @@ -24,6 +26,21 @@ func (ms *MediaSource) LocationOrig(m Media) string { return path.Join(ms.StorageDir, m.Name) } +func (ms *MediaSource) receiveNewMedia(name string, r io.Reader) error { + dest := path.Join(ms.StorageDir, name) + f, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + return err + } + + _, err = io.Copy(f, r) + if err != nil { + return err + } + + return f.Close() +} + type Media struct { Type string Name string @@ -122,6 +139,38 @@ func (ms *MediaSource) Walk() ([]*Media, error) { return media, err } +func (ch *CaddyHugo) uploadMedia(w http.ResponseWriter, r *http.Request) (int, error) { + if ch.Media == nil { + http.NotFound(w, r) + return 404, nil + } + + mr, err := r.MultipartReader() + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return 400, nil + } + + for { + part, err := mr.NextPart() + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return 400, nil + } + + name := part.FileName() + if name != "" { + err = ch.Media.receiveNewMedia(name, part) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return 500, nil + } + } + } + + return 200, nil +} + func (ch *CaddyHugo) serveMediaPage(w http.ResponseWriter, r *http.Request) (int, error) { if ch.Media == nil { http.NotFound(w, r) @@ -131,7 +180,11 @@ func (ch *CaddyHugo) serveMediaPage(w http.ResponseWriter, r *http.Request) (int io.WriteString(w, ` +
+
`) + io.WriteString(w, UploadPage("media")) + io.WriteString(w, "
") if ch.Media != nil { media, err := ch.Media.Walk() if err != nil { @@ -140,10 +193,12 @@ func (ch *CaddyHugo) serveMediaPage(w http.ResponseWriter, r *http.Request) (int } for _, m := range media { + fmt.Fprintf(w, `
`) + src, width, height, err := ch.Media.ThumbMax(*m, 100) if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return 500, nil + fmt.Fprintf(w, `
error rendering %q: %v
`, m.Name, err) + continue } fmt.Fprintf(w, `

`, width, height, src, src) } diff --git a/templates.go b/templates.go index 2ba9595..9718915 100644 --- a/templates.go +++ b/templates.go @@ -392,3 +392,78 @@ var AuthorPage = ` ` + +func UploadPage(elemName string) string { + return fmt.Sprintf(` + + + +`, elemName, elemName, elemName, elemName, elemName, elemName) +}