This commit is contained in:
2025-03-31 11:59:42 +08:00
parent 963e1e005e
commit 6fb06c456c
52 changed files with 2244 additions and 753 deletions

View File

@@ -8,6 +8,7 @@ import (
type CommonHandler interface {
CaptchaHandler() CaptchaHandler
UploadHandler() UploadHandler
}
type commonHandler struct {
@@ -29,3 +30,7 @@ func NewCommonHandler(conf *config.Config, render tpl.Renderer, biz commonv1.Com
func (h *commonHandler) CaptchaHandler() CaptchaHandler {
return NewCaptchaHandler(&h.conf.Captcha, h.render, h.biz.CaptchaBiz())
}
func (h *commonHandler) UploadHandler() UploadHandler {
return NewUploadHandler(h.render)
}

View File

@@ -0,0 +1,111 @@
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})
}