upload
This commit is contained in:
parent
759863f1aa
commit
5c8182cdf9
2
.gitignore
vendored
2
.gitignore
vendored
@ -32,4 +32,4 @@ go.work
|
|||||||
!configs/config.dev.yaml
|
!configs/config.dev.yaml
|
||||||
!sqlc.yaml
|
!sqlc.yaml
|
||||||
|
|
||||||
upload/
|
public/
|
||||||
|
|||||||
32
internal/erpserver/handler/upload/route.go
Normal file
32
internal/erpserver/handler/upload/route.go
Normal 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)
|
||||||
|
})
|
||||||
|
}
|
||||||
123
internal/erpserver/handler/upload/upload.go
Normal file
123
internal/erpserver/handler/upload/upload.go
Normal 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)
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user