This commit is contained in:
kenneth 2025-06-17 11:41:45 +08:00
parent 759863f1aa
commit 5c8182cdf9
3 changed files with 156 additions and 1 deletions

2
.gitignore vendored
View File

@ -32,4 +32,4 @@ go.work
!configs/config.dev.yaml
!sqlc.yaml
upload/
public/

View File

@ -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)
})
}

View File

@ -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)
}