198 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package apis
 | ||
| 
 | ||
| import (
 | ||
| 	"encoding/base64"
 | ||
| 	"errors"
 | ||
| 	"fmt"
 | ||
| 	"io/ioutil"
 | ||
| 	"strings"
 | ||
| 
 | ||
| 	"github.com/gin-gonic/gin"
 | ||
| 	"github.com/go-admin-team/go-admin-core/sdk/api"
 | ||
| 	"github.com/go-admin-team/go-admin-core/sdk/pkg"
 | ||
| 	"github.com/go-admin-team/go-admin-core/sdk/pkg/utils"
 | ||
| 	"github.com/google/uuid"
 | ||
| 
 | ||
| 	"go-admin/common/file_store"
 | ||
| )
 | ||
| 
 | ||
| type FileResponse struct {
 | ||
| 	Size     int64  `json:"size"`
 | ||
| 	Path     string `json:"path"`
 | ||
| 	FullPath string `json:"full_path"`
 | ||
| 	Name     string `json:"name"`
 | ||
| 	Type     string `json:"type"`
 | ||
| }
 | ||
| 
 | ||
| const path = "static/uploadfile/"
 | ||
| 
 | ||
| type File struct {
 | ||
| 	api.Api
 | ||
| }
 | ||
| 
 | ||
| // UploadFile 上传图片
 | ||
| // @Summary 上传图片
 | ||
| // @Description 获取JSON
 | ||
| // @Tags 公共接口
 | ||
| // @Accept multipart/form-data
 | ||
| // @Param type query string true "type" (1:单图,2:多图, 3:base64图片)
 | ||
| // @Param file formData file true "file"
 | ||
| // @Success 200 {string} string	"{"code": 200, "message": "添加成功"}"
 | ||
| // @Success 200 {string} string	"{"code": -1, "message": "添加失败"}"
 | ||
| // @Router /api/v1/public/uploadFile [post]
 | ||
| // @Security Bearer
 | ||
| func (e File) UploadFile(c *gin.Context) {
 | ||
| 	e.MakeContext(c)
 | ||
| 	tag, _ := c.GetPostForm("type")
 | ||
| 	urlPrefix := fmt.Sprintf("%s://%s/", "http", c.Request.Host)
 | ||
| 
 | ||
| 	switch tag {
 | ||
| 	case "1": // 单图
 | ||
| 		e.handleSingleFile(c, urlPrefix)
 | ||
| 	case "2": // 多图
 | ||
| 		e.handleMultipleFiles(c, urlPrefix)
 | ||
| 	case "3": // base64
 | ||
| 		e.handleBase64File(c, urlPrefix)
 | ||
| 	default:
 | ||
| 		e.handleSingleFile(c, urlPrefix)
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| func (e File) handleSingleFile(c *gin.Context, urlPrefix string) {
 | ||
| 	fileResponse, done := e.singleFile(c, FileResponse{}, urlPrefix)
 | ||
| 	if done {
 | ||
| 		return
 | ||
| 	}
 | ||
| 	e.OK(fileResponse, "上传成功")
 | ||
| }
 | ||
| 
 | ||
| func (e File) handleMultipleFiles(c *gin.Context, urlPrefix string) {
 | ||
| 	multipartFile := e.multipleFile(c, urlPrefix)
 | ||
| 	e.OK(multipartFile, "上传成功")
 | ||
| }
 | ||
| 
 | ||
| func (e File) handleBase64File(c *gin.Context, urlPrefix string) {
 | ||
| 	fileResponse := e.baseImg(c, FileResponse{}, urlPrefix)
 | ||
| 	e.OK(fileResponse, "上传成功")
 | ||
| }
 | ||
| 
 | ||
| func (e File) baseImg(c *gin.Context, fileResponse FileResponse, urlPrefix string) FileResponse {
 | ||
| 	files, _ := c.GetPostForm("file")
 | ||
| 	file2list := strings.Split(files, ",")
 | ||
| 	decodedData, _ := base64.StdEncoding.DecodeString(file2list[1])
 | ||
| 	fileName := uuid.New().String() + ".jpg"
 | ||
| 
 | ||
| 	if err := utils.IsNotExistMkDir(path); err != nil {
 | ||
| 		e.Error(500, errors.New(""), "初始化文件路径失败")
 | ||
| 		return fileResponse
 | ||
| 	}
 | ||
| 
 | ||
| 	base64File := path + fileName
 | ||
| 	_ = ioutil.WriteFile(base64File, decodedData, 0666)
 | ||
| 	typeStr := strings.Replace(strings.Replace(file2list[0], "data:", "", -1), ";base64", "", -1)
 | ||
| 
 | ||
| 	fileResponse = e.buildFileResponse(base64File, urlPrefix, "", typeStr)
 | ||
| 	source, _ := c.GetPostForm("source")
 | ||
| 
 | ||
| 	if err := thirdUpload(source, fileName, base64File); err != nil {
 | ||
| 		e.Error(200, errors.New(""), "上传第三方失败")
 | ||
| 		return fileResponse
 | ||
| 	}
 | ||
| 
 | ||
| 	if source != "1" {
 | ||
| 		fileResponse.Path = "/static/uploadfile/" + fileName
 | ||
| 		fileResponse.FullPath = "/static/uploadfile/" + fileName
 | ||
| 	}
 | ||
| 	return fileResponse
 | ||
| }
 | ||
| 
 | ||
| func (e File) multipleFile(c *gin.Context, urlPrefix string) []FileResponse {
 | ||
| 	files := c.Request.MultipartForm.File["file"]
 | ||
| 	source, _ := c.GetPostForm("source")
 | ||
| 	var multipartFile []FileResponse
 | ||
| 
 | ||
| 	for _, f := range files {
 | ||
| 		fileName := uuid.New().String() + utils.GetExt(f.Filename)
 | ||
| 
 | ||
| 		if err := utils.IsNotExistMkDir(path); err != nil {
 | ||
| 			e.Error(500, errors.New(""), "初始化文件路径失败")
 | ||
| 			continue
 | ||
| 		}
 | ||
| 
 | ||
| 		multipartFileName := path + fileName
 | ||
| 		if err := c.SaveUploadedFile(f, multipartFileName); err != nil {
 | ||
| 			continue
 | ||
| 		}
 | ||
| 
 | ||
| 		fileType, _ := utils.GetType(multipartFileName)
 | ||
| 		if err := thirdUpload(source, fileName, multipartFileName); err != nil {
 | ||
| 			e.Error(500, errors.New(""), "上传第三方失败")
 | ||
| 			continue
 | ||
| 		}
 | ||
| 
 | ||
| 		fileResponse := e.buildFileResponse(multipartFileName, urlPrefix, f.Filename, fileType)
 | ||
| 		if source != "1" {
 | ||
| 			fileResponse.Path = "/static/uploadfile/" + fileName
 | ||
| 			fileResponse.FullPath = "/static/uploadfile/" + fileName
 | ||
| 		}
 | ||
| 		multipartFile = append(multipartFile, fileResponse)
 | ||
| 	}
 | ||
| 	return multipartFile
 | ||
| }
 | ||
| 
 | ||
| func (e File) singleFile(c *gin.Context, fileResponse FileResponse, urlPrefix string) (FileResponse, bool) {
 | ||
| 	files, err := c.FormFile("file")
 | ||
| 	if err != nil {
 | ||
| 		e.Error(200, errors.New(""), "图片不能为空")
 | ||
| 		return FileResponse{}, true
 | ||
| 	}
 | ||
| 
 | ||
| 	fileName := uuid.New().String() + utils.GetExt(files.Filename)
 | ||
| 	if err := utils.IsNotExistMkDir(path); err != nil {
 | ||
| 		e.Error(500, errors.New(""), "初始化文件路径失败")
 | ||
| 		return FileResponse{}, true
 | ||
| 	}
 | ||
| 
 | ||
| 	singleFile := path + fileName
 | ||
| 	if err := c.SaveUploadedFile(files, singleFile); err != nil {
 | ||
| 		e.Error(500, errors.New(""), "文件保存失败")
 | ||
| 		return FileResponse{}, true
 | ||
| 	}
 | ||
| 
 | ||
| 	fileType, _ := utils.GetType(singleFile)
 | ||
| 	fileResponse = e.buildFileResponse(singleFile, urlPrefix, files.Filename, fileType)
 | ||
| 	fileResponse.Path = "/static/uploadfile/" + fileName
 | ||
| 	fileResponse.FullPath = "/static/uploadfile/" + fileName
 | ||
| 	return fileResponse, false
 | ||
| }
 | ||
| 
 | ||
| func (e File) buildFileResponse(filePath, urlPrefix, fileName, fileType string) FileResponse {
 | ||
| 	return FileResponse{
 | ||
| 		Size:     pkg.GetFileSize(filePath),
 | ||
| 		Path:     filePath,
 | ||
| 		FullPath: urlPrefix + filePath,
 | ||
| 		Name:     fileName,
 | ||
| 		Type:     fileType,
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| func thirdUpload(source string, name string, path string) error {
 | ||
| 	switch source {
 | ||
| 	case "2":
 | ||
| 		return ossUpload("img/"+name, path)
 | ||
| 	case "3":
 | ||
| 		return qiniuUpload("img/"+name, path)
 | ||
| 	}
 | ||
| 	return nil
 | ||
| }
 | ||
| 
 | ||
| func ossUpload(name string, path string) error {
 | ||
| 	oss := file_store.ALiYunOSS{}
 | ||
| 	return oss.UpLoad(name, path)
 | ||
| }
 | ||
| 
 | ||
| func qiniuUpload(name string, path string) error {
 | ||
| 	oss := file_store.ALiYunOSS{}
 | ||
| 	return oss.UpLoad(name, path)
 | ||
| }
 |