Procházet zdrojové kódy

图片文件上传,合法性判断

yxh před 6 roky
rodič
revize
3be7d482a9

+ 40 - 0
app/controller/admin/upload.go

@@ -9,6 +9,7 @@ import (
 
 type Upload struct{}
 
+//单图片上传
 func (c *Upload) UpImg(r *ghttp.Request) {
 	upFile := r.GetUploadFile("file")
 	info, err := upload_service.UpImg(upFile)
@@ -20,3 +21,42 @@ func (c *Upload) UpImg(r *ghttp.Request) {
 	}
 	response.SusJson(true, r, "上传成功", res)
 }
+
+//批量上传图片
+func (c *Upload) UpImgs(r *ghttp.Request) {
+	upFiles := r.GetUploadFiles("file")
+	infos, err := upload_service.UpImgs(upFiles)
+	if err != nil {
+		response.FailJson(true, r, "上传失败,"+err.Error())
+	}
+	res := g.Map{
+		"fileInfos": infos,
+	}
+	response.SusJson(true, r, "上传成功", res)
+}
+
+//单文件上传
+func (c *Upload) UpFile(r *ghttp.Request) {
+	upFile := r.GetUploadFile("file")
+	info, err := upload_service.UpFile(upFile)
+	if err != nil {
+		response.FailJson(true, r, "上传失败,"+err.Error())
+	}
+	res := g.Map{
+		"fileInfo": info,
+	}
+	response.SusJson(true, r, "上传成功", res)
+}
+
+//批量上传文件
+func (c *Upload) UpFiles(r *ghttp.Request) {
+	upFiles := r.GetUploadFiles("file")
+	infos, err := upload_service.UpFiles(upFiles)
+	if err != nil {
+		response.FailJson(true, r, "上传失败,"+err.Error())
+	}
+	res := g.Map{
+		"fileInfos": infos,
+	}
+	response.SusJson(true, r, "上传成功", res)
+}

+ 5 - 0
app/service/admin/params_service/params.go

@@ -3,6 +3,7 @@ package params_service
 import (
 	"gfast/app/model/admin/sys_config"
 	"gfast/app/service/cache_service"
+	"github.com/gogf/gf/errors/gerror"
 )
 
 //保存参数
@@ -42,6 +43,10 @@ func DeleteByIds(ids []int) error {
 
 //通过key获取参数
 func GetConfigByKey(key string) (config *sys_config.Entity, err error) {
+	if key == "" {
+		err = gerror.New("参数key不能为空")
+		return
+	}
 	cache := cache_service.New()
 	cf := cache.Get(key)
 	if cf != nil {

+ 106 - 11
app/service/admin/upload_service/upload.go

@@ -12,28 +12,61 @@ import (
 	"github.com/gogf/gf/util/gconv"
 )
 
+const upPath = "/pub_upload/"
+
 var uploadPath string
 
 //上传得文件信息
 type FileInfo struct {
-	FileName string
-	FileSize int64
-	FileUrl  string
-	fileType string
+	FileName string `json:"fileName"`
+	FileSize int64  `json:"fileSize"`
+	FileUrl  string `json:"fileUrl"`
+	FileType string `json:"fileType"`
 }
 
 func init() {
-	uploadPath = g.Cfg().GetString("server.ServerRoot") + "/pub_upload/"
+	uploadPath = g.Cfg().GetString("server.ServerRoot") + upPath
 }
 
 //上传图片
 func UpImg(file *ghttp.UploadFile) (fileInfo *FileInfo, err error) {
+	return upByType(file, "img")
+}
+
+//上传文件
+func UpFile(file *ghttp.UploadFile) (fileInfo *FileInfo, err error) {
+	return upByType(file, "file")
+}
+
+//批量上传图片
+func UpImgs(files []*ghttp.UploadFile) (fileInfos []*FileInfo, err error) {
+	return UpBathByType(files, "img")
+}
+
+//批量上传文件
+func UpFiles(files []*ghttp.UploadFile) (fileInfos []*FileInfo, err error) {
+	return UpBathByType(files, "file")
+}
+
+//文件上传 img|file
+func upByType(file *ghttp.UploadFile, fType string) (fileInfo *FileInfo, err error) {
 	if file == nil {
 		err = gerror.New("未上传任何文件")
 		return
 	}
+	var (
+		typeKey string
+		sizeKey string
+	)
+	if fType == "img" {
+		typeKey = "sys.uploadFile.imageType"
+		sizeKey = "sys.uploadFile.imageSize"
+	} else if fType == "file" {
+		typeKey = "sys.uploadFile.fileType"
+		sizeKey = "sys.uploadFile.fileSize"
+	}
 	//获取上传类型配置
-	config, err := getUpConfig("sys.uploadFile.imageType")
+	config, err := getUpConfig(typeKey)
 	if err != nil {
 		return
 	}
@@ -44,7 +77,7 @@ func UpImg(file *ghttp.UploadFile) (fileInfo *FileInfo, err error) {
 		return
 	}
 	//获取上传大小配置
-	config, err = getUpConfig("sys.uploadFile.imageSize")
+	config, err = getUpConfig(sizeKey)
 	if err != nil {
 		return
 	}
@@ -53,7 +86,7 @@ func UpImg(file *ghttp.UploadFile) (fileInfo *FileInfo, err error) {
 		return
 	}
 	if !rightSize {
-		gerror.New("上传文件超过最大尺寸:" + config.ConfigValue)
+		err = gerror.New("上传文件超过最大尺寸:" + config.ConfigValue)
 		return
 	}
 	path := getUpPath()
@@ -65,7 +98,69 @@ func UpImg(file *ghttp.UploadFile) (fileInfo *FileInfo, err error) {
 		FileName: file.Filename,
 		FileSize: file.Size,
 		FileUrl:  getUrl(path, fileName),
-		fileType: file.Header.Get("Content-type"),
+		FileType: file.Header.Get("Content-type"),
+	}
+	return
+}
+
+//批量上传 img|file
+func UpBathByType(files []*ghttp.UploadFile, fType string) (fileInfos []*FileInfo, err error) {
+	if len(files) == 0 {
+		err = gerror.New("未上传任何文件")
+		return
+	}
+	var (
+		typeKey string
+		sizeKey string
+	)
+	if fType == "img" {
+		typeKey = "sys.uploadFile.imageType"
+		sizeKey = "sys.uploadFile.imageSize"
+	} else if fType == "file" {
+		typeKey = "sys.uploadFile.fileType"
+		sizeKey = "sys.uploadFile.fileSize"
+	}
+	//获取上传类型配置
+	configType, err := getUpConfig(typeKey)
+	if err != nil {
+		return
+	}
+	//获取上传大小配置
+	configSize, err := getUpConfig(sizeKey)
+	if err != nil {
+		return
+	}
+	for _, file := range files {
+		//检测文件类型
+		rightType := checkFileType(file.Filename, configType.ConfigValue)
+		if !rightType {
+			err = gerror.New("上传文件类型错误,只能包含后缀为:" + configType.ConfigValue + "的文件。")
+			return
+		}
+		var rightSize bool
+		rightSize, err = checkSize(configSize.ConfigValue, file.Size)
+		if err != nil {
+			return
+		}
+		if !rightSize {
+			err = gerror.New("上传文件超过最大尺寸:" + configSize.ConfigValue)
+			return
+		}
+	}
+	path := getUpPath()
+	for _, file := range files {
+		var fileName string
+		fileName, err = file.Save(path, true)
+		if err != nil {
+			return
+		}
+		fileInfo := &FileInfo{
+			FileName: file.Filename,
+			FileSize: file.Size,
+			FileUrl:  getUrl(path, fileName),
+			FileType: file.Header.Get("Content-type"),
+		}
+		fileInfos = append(fileInfos, fileInfo)
 	}
 	return
 }
@@ -111,7 +206,7 @@ func getUpConfig(key string) (config *sys_config.Entity, err error) {
 
 //判断上传文件类型是否合法
 func checkFileType(fileName, typeString string) bool {
-	suffix := gstr.SubStr(fileName, gstr.Pos(fileName, ".")+1)
+	suffix := gstr.SubStr(fileName, gstr.SearchArray(gstr.Split(fileName, ""), ".")+1)
 	imageType := gstr.Split(typeString, ",")
 	rightType := false
 	for _, v := range imageType {
@@ -129,6 +224,6 @@ func getUpPath() (upPath string) {
 }
 
 func getUrl(path, fileName string) string {
-	url := gstr.SubStr(path, gstr.Pos(path, "/pub_upload/")+1) + fileName
+	url := gstr.SubStr(path, gstr.Pos(path, upPath)+1) + fileName
 	return url
 }

+ 4 - 2
test/demo2_test.go

@@ -2,7 +2,7 @@ package test
 
 import (
 	"fmt"
-	"github.com/gogf/gf/os/gtime"
+	"github.com/gogf/gf/text/gstr"
 	"testing"
 )
 
@@ -11,5 +11,7 @@ func TestDemo2(t *testing.T) {
 }
 
 func test21(t *testing.T) {
-	fmt.Println(gtime.Date())
+	str := "字s符s串.中文测试"
+	fmt.Println(gstr.SearchArray(gstr.Split(str, ""), "."))
+	fmt.Println(gstr.SubStr(str, gstr.SearchArray(gstr.Split(str, ""), ".")+1))
 }