124 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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)
 | |
| }
 |