server: handle multiple uploads

This commit is contained in:
mappu 2017-10-08 14:10:15 +13:00
parent dca72442d9
commit f6b9fd2536
2 changed files with 53 additions and 13 deletions

View File

@ -138,18 +138,7 @@ func (this *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
this.handleAbout(w)
} else if r.Method == "POST" && r.URL.Path == `/upload` {
mp, mph, err := r.FormFile("f")
if err != nil {
log.Printf("%s Invalid request: %s\n", r.RemoteAddr, err.Error())
http.Error(w, "Invalid request", 400)
}
path, err := this.handleUpload(mp, mph, strings.TrimRight(r.RemoteAddr, "0123456789:")) // strip remote-port
if err != nil {
log.Printf("%s Upload failed: %s\n", r.RemoteAddr, err.Error())
http.Error(w, "Upload failed", 500)
} else {
http.Redirect(w, r, `/view/`+path, http.StatusFound)
}
this.handleUpload(w, r)
} else {
// TODO embed into binary

View File

@ -3,9 +3,12 @@ package contented
import (
"crypto/sha512"
"encoding/hex"
"encoding/json"
"io"
"log"
"mime"
"mime/multipart"
"net/http"
"os"
"path"
"path/filepath"
@ -13,7 +16,55 @@ import (
"time"
)
func (this *Server) handleUpload(src multipart.File, hdr *multipart.FileHeader, UploadIP string) (string, error) {
func (this *Server) handleUpload(w http.ResponseWriter, r *http.Request) {
err := r.ParseMultipartForm(this.opts.MaxUploadBytes * 2)
if err != nil {
log.Printf("%s Invalid request: %s\n", r.RemoteAddr, err.Error())
http.Error(w, "Invalid request", 400)
return
}
if r.MultipartForm == nil || r.MultipartForm.File == nil || len(r.MultipartForm.File["f"]) < 1 {
log.Printf("%s Invalid request: no multipart content\n", r.RemoteAddr)
http.Error(w, "Invalid request", 400)
return
}
remoteIP := strings.TrimRight(r.RemoteAddr, "0123456789:")
ret := make([]string, 0, len(r.MultipartForm.File["f"]))
for _, fhs := range r.MultipartForm.File["f"] {
f, err := fhs.Open()
if err != nil {
log.Printf("%s Internal error: %s\n", r.RemoteAddr, err.Error())
http.Error(w, "Internal error", 500)
return
}
path, err := this.handleUploadFile(f, fhs, remoteIP)
if err != nil {
log.Printf("%s Upload failed: %s\n", r.RemoteAddr, err.Error())
http.Error(w, "Upload failed", 500)
}
ret = append(ret, path)
}
jb, err := json.Marshal(ret)
if err != nil {
log.Printf("%s Internal error: %s\n", r.RemoteAddr, err.Error())
http.Error(w, "Internal error", 500)
return
}
w.Header().Set(`Content-Type`, `application/json`)
w.WriteHeader(200)
w.Write(jb)
}
func (this *Server) handleUploadFile(src multipart.File, hdr *multipart.FileHeader, UploadIP string) (string, error) {
// Get file length
srcLen, err := src.Seek(0, io.SeekEnd)