From 5c8182cdf9eaf364865e5c9cf1a2db2a49c7362b Mon Sep 17 00:00:00 2001 From: kenneth <1185230223@qq.com> Date: Tue, 17 Jun 2025 11:41:45 +0800 Subject: [PATCH] upload --- .gitignore | 2 +- internal/erpserver/handler/upload/route.go | 32 +++++ internal/erpserver/handler/upload/upload.go | 123 ++++++++++++++++++++ 3 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 internal/erpserver/handler/upload/route.go create mode 100644 internal/erpserver/handler/upload/upload.go diff --git a/.gitignore b/.gitignore index 48b0cc0..4fc02d4 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,4 @@ go.work !configs/config.dev.yaml !sqlc.yaml -upload/ \ No newline at end of file +public/ diff --git a/internal/erpserver/handler/upload/route.go b/internal/erpserver/handler/upload/route.go new file mode 100644 index 0000000..c54236c --- /dev/null +++ b/internal/erpserver/handler/upload/route.go @@ -0,0 +1,32 @@ +package upload + +import ( + v1 "management/internal/erpserver/service/v1" + "management/internal/pkg/config" + "management/internal/pkg/mid" + "management/internal/pkg/render" + "management/internal/pkg/session" + + "github.com/drhin/logger" + "github.com/go-chi/chi/v5" +) + +type Config struct { + Conf *config.Config + Log *logger.Logger + Sm session.Manager + Render render.Renderer + MenuService v1.MenuService +} + +func Routes(r chi.Router, cfg Config) { + app := newApp(cfg.Log, cfg.Render) + + r.Route("/upload", func(r chi.Router) { + r.Use(mid.Authorize(cfg.Sm, cfg.MenuService)) + r.Use(mid.Audit(cfg.Sm, cfg.Log)) + r.Get("/img", app.img) + r.Get("/file", app.file) + r.Get("/multi_files", app.multiFiles) + }) +} diff --git a/internal/erpserver/handler/upload/upload.go b/internal/erpserver/handler/upload/upload.go new file mode 100644 index 0000000..28ff4a1 --- /dev/null +++ b/internal/erpserver/handler/upload/upload.go @@ -0,0 +1,123 @@ +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) +}