package common import ( "mime/multipart" "net/http" fileutil "management/internal/pkg/file" "management/internal/pkg/tpl" ) type UploadHandler interface { Img(w http.ResponseWriter, r *http.Request) File(w http.ResponseWriter, r *http.Request) MutilFiles(w http.ResponseWriter, r *http.Request) } type uploadHandler struct { render tpl.Renderer } var _ UploadHandler = (*uploadHandler)(nil) func NewUploadHandler(render tpl.Renderer) *uploadHandler { return &uploadHandler{ render: render, } } const maxImageSize = 100 << 20 // 100 MB func (h *uploadHandler) Img(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() _, fh, err := r.FormFile("files") if err != nil { h.render.JSONERR(w, err.Error()) return } path, err := fileutil.UploadFile(fh, fileutil.IMG) if err != nil { h.render.JSONERR(w, err.Error()) return } h.render.JSON(w, tpl.Response{Success: true, Message: "ok", Data: path}) } func (h *uploadHandler) File(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() _, fh, err := r.FormFile("files") if err != nil { h.render.JSONERR(w, err.Error()) return } path, err := fileutil.UploadFile(fh, fileutil.ALL) if err != nil { h.render.JSONERR(w, err.Error()) return } h.render.JSON(w, tpl.Response{Success: true, Message: "ok", Data: path}) } type UploadFileRes struct { Name string `json:"name"` Path string `json:"path"` } func (h *uploadHandler) MutilFiles(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() err := r.ParseMultipartForm(int64(maxImageSize)) if err != nil { return } files := r.MultipartForm.File["files"] var res []UploadFileRes c := make(chan UploadFileRes, 2) defer close(c) for i, file := range files { go func(item *multipart.FileHeader, key int) { ufr := UploadFileRes{Name: item.Filename} filePath, err := fileutil.UploadFile(item, fileutil.ALL) if err != nil { h.render.JSONERR(w, err.Error()) return } ufr.Path = filePath c <- ufr }(file, i) } for { v, ok := <-c if ok { res = append(res, v) } if len(files) == len(res) { break } } h.render.JSON(w, tpl.Response{Success: true, Message: "ok", Data: res}) }