package upload import ( "io" "mime/multipart" "net/http" fileutil "management/internal/pkg/file" "management/internal/pkg/render" "github.com/drhin/logger" ) type app struct { log *logger.Logger render render.Renderer } func newApp(log *logger.Logger, render render.Renderer) *app { return &app{ log: log, render: render, } } const maxImageSize = 100 << 20 // 100 MB func (a *app) img(w http.ResponseWriter, r *http.Request) { defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { a.log.Error(err.Error(), err) } }(r.Body) _, fh, err := r.FormFile("files") if err != nil { a.render.JSONErr(w, err.Error()) return } path, err := fileutil.UploadFile(fh, fileutil.IMG) if err != nil { a.render.JSONErr(w, err.Error()) return } a.render.JSONObj(w, "ok", path) } func (a *app) file(w http.ResponseWriter, r *http.Request) { defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { a.log.Error(err.Error(), err) } }(r.Body) _, fh, err := r.FormFile("files") if err != nil { a.render.JSONErr(w, err.Error()) return } path, err := fileutil.UploadFile(fh, fileutil.ALL) if err != nil { a.render.JSONErr(w, err.Error()) return } a.render.JSONObj(w, "ok", path) } type FileRes struct { Name string `json:"name"` Path string `json:"path"` } func (a *app) multiFiles(w http.ResponseWriter, r *http.Request) { defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { a.log.Error(err.Error(), err) } }(r.Body) err := r.ParseMultipartForm(int64(maxImageSize)) if err != nil { return } files := r.MultipartForm.File["files"] var res []FileRes c := make(chan FileRes, 2) defer close(c) for i, file := range files { go func(item *multipart.FileHeader, key int) { ufr := FileRes{Name: item.Filename} filePath, err := fileutil.UploadFile(item, fileutil.ALL) if err != nil { a.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 } } a.render.JSONObj(w, "ok", res) }