2025-05-07 14:12:53 +08:00

120 lines
2.1 KiB
Go

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