package common import ( "io" "mime/multipart" "net/http" "management/internal/erpserver/handler" fileutil "management/internal/pkg/file" ) type UploadHandler struct { *handler.Handler } func NewUploadHandler(handler *handler.Handler) *UploadHandler { return &UploadHandler{ Handler: handler, } } const maxImageSize = 100 << 20 // 100 MB func (h *UploadHandler) Img(w http.ResponseWriter, r *http.Request) { defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { h.Log.Error(err.Error(), err) } }(r.Body) _, fh, err := r.FormFile("files") if err != nil { h.JSONErr(w, err.Error()) return } path, err := fileutil.UploadFile(fh, fileutil.IMG) if err != nil { h.JSONErr(w, err.Error()) return } h.JSONObj(w, "ok", path) } func (h *UploadHandler) File(w http.ResponseWriter, r *http.Request) { defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { h.Log.Error(err.Error(), err) } }(r.Body) _, fh, err := r.FormFile("files") if err != nil { h.JSONErr(w, err.Error()) return } path, err := fileutil.UploadFile(fh, fileutil.ALL) if err != nil { h.JSONErr(w, err.Error()) return } h.JSONObj(w, "ok", path) } type UploadFileRes struct { Name string `json:"name"` Path string `json:"path"` } func (h *UploadHandler) MultiFiles(w http.ResponseWriter, r *http.Request) { defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { h.Log.Error(err.Error(), err) } }(r.Body) 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.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.JSONObj(w, "ok", res) }