205 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			205 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)
 | 
						||
	var fileResponse FileResponse
 | 
						||
 | 
						||
	switch tag {
 | 
						||
	case "1": // 单图
 | 
						||
		var done bool
 | 
						||
		fileResponse, done = e.singleFile(c, fileResponse, urlPrefix)
 | 
						||
		if done {
 | 
						||
			return
 | 
						||
		}
 | 
						||
		e.OK(fileResponse, "上传成功")
 | 
						||
		return
 | 
						||
	case "2": // 多图
 | 
						||
		multipartFile := e.multipleFile(c, urlPrefix)
 | 
						||
		e.OK(multipartFile, "上传成功")
 | 
						||
		return
 | 
						||
	case "3": // base64
 | 
						||
		fileResponse = e.baseImg(c, fileResponse, urlPrefix)
 | 
						||
		e.OK(fileResponse, "上传成功")
 | 
						||
	default:
 | 
						||
		var done bool
 | 
						||
		fileResponse, done = e.singleFile(c, fileResponse, urlPrefix)
 | 
						||
		if done {
 | 
						||
			return
 | 
						||
		}
 | 
						||
		e.OK(fileResponse, "上传成功")
 | 
						||
		return
 | 
						||
	}
 | 
						||
 | 
						||
}
 | 
						||
 | 
						||
func (e File) baseImg(c *gin.Context, fileResponse FileResponse, urlPerfix string) FileResponse {
 | 
						||
	files, _ := c.GetPostForm("file")
 | 
						||
	file2list := strings.Split(files, ",")
 | 
						||
	ddd, _ := base64.StdEncoding.DecodeString(file2list[1])
 | 
						||
	guid := uuid.New().String()
 | 
						||
	fileName := guid + ".jpg"
 | 
						||
	err := utils.IsNotExistMkDir(path)
 | 
						||
	if err != nil {
 | 
						||
		e.Error(500, errors.New(""), "初始化文件路径失败")
 | 
						||
	}
 | 
						||
	base64File := path + fileName
 | 
						||
	_ = ioutil.WriteFile(base64File, ddd, 0666)
 | 
						||
	typeStr := strings.Replace(strings.Replace(file2list[0], "data:", "", -1), ";base64", "", -1)
 | 
						||
	fileResponse = FileResponse{
 | 
						||
		Size:     pkg.GetFileSize(base64File),
 | 
						||
		Path:     base64File,
 | 
						||
		FullPath: urlPerfix + base64File,
 | 
						||
		Name:     "",
 | 
						||
		Type:     typeStr,
 | 
						||
	}
 | 
						||
	source, _ := c.GetPostForm("source")
 | 
						||
	err = thirdUpload(source, fileName, base64File)
 | 
						||
	if 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, urlPerfix string) []FileResponse {
 | 
						||
	files := c.Request.MultipartForm.File["file"]
 | 
						||
	source, _ := c.GetPostForm("source")
 | 
						||
	var multipartFile []FileResponse
 | 
						||
	for _, f := range files {
 | 
						||
		guid := uuid.New().String()
 | 
						||
		fileName := guid + utils.GetExt(f.Filename)
 | 
						||
 | 
						||
		err := utils.IsNotExistMkDir(path)
 | 
						||
		if err != nil {
 | 
						||
			e.Error(500, errors.New(""), "初始化文件路径失败")
 | 
						||
		}
 | 
						||
		multipartFileName := path + fileName
 | 
						||
		err1 := c.SaveUploadedFile(f, multipartFileName)
 | 
						||
		fileType, _ := utils.GetType(multipartFileName)
 | 
						||
		if err1 == nil {
 | 
						||
			err := thirdUpload(source, fileName, multipartFileName)
 | 
						||
			if err != nil {
 | 
						||
				e.Error(500, errors.New(""), "上传第三方失败")
 | 
						||
			} else {
 | 
						||
				fileResponse := FileResponse{
 | 
						||
					Size:     pkg.GetFileSize(multipartFileName),
 | 
						||
					Path:     multipartFileName,
 | 
						||
					FullPath: urlPerfix + multipartFileName,
 | 
						||
					Name:     f.Filename,
 | 
						||
					Type:     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, urlPerfix string) (FileResponse, bool) {
 | 
						||
	files, err := c.FormFile("file")
 | 
						||
 | 
						||
	if err != nil {
 | 
						||
		e.Error(200, errors.New(""), "图片不能为空")
 | 
						||
		return FileResponse{}, true
 | 
						||
	}
 | 
						||
	// 上传文件至指定目录
 | 
						||
	guid := uuid.New().String()
 | 
						||
 | 
						||
	fileName := guid + utils.GetExt(files.Filename)
 | 
						||
 | 
						||
	err = utils.IsNotExistMkDir(path)
 | 
						||
	if err != nil {
 | 
						||
		e.Error(500, errors.New(""), "初始化文件路径失败")
 | 
						||
	}
 | 
						||
	singleFile := path + fileName
 | 
						||
	_ = c.SaveUploadedFile(files, singleFile)
 | 
						||
	fileType, _ := utils.GetType(singleFile)
 | 
						||
	fileResponse = FileResponse{
 | 
						||
		Size:     pkg.GetFileSize(singleFile),
 | 
						||
		Path:     singleFile,
 | 
						||
		FullPath: urlPerfix + singleFile,
 | 
						||
		Name:     files.Filename,
 | 
						||
		Type:     fileType,
 | 
						||
	}
 | 
						||
	//source, _ := c.GetPostForm("source")
 | 
						||
	//err = thirdUpload(source, fileName, singleFile)
 | 
						||
	//if err != nil {
 | 
						||
	//	e.Error(200, errors.New(""), "上传第三方失败")
 | 
						||
	//	return FileResponse{}, true
 | 
						||
	//}
 | 
						||
	fileResponse.Path = "/static/uploadfile/" + fileName
 | 
						||
	fileResponse.FullPath = "/static/uploadfile/" + fileName
 | 
						||
	return fileResponse, false
 | 
						||
}
 | 
						||
 | 
						||
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)
 | 
						||
}
 |