Browse Source

GetImage方法

huangyan 1 year ago
parent
commit
5ef78b4ca6
6 changed files with 194 additions and 52 deletions
  1. 135 44
      app/controller/file.go
  2. 4 2
      app/router.go
  3. 3 0
      configs/config.yaml
  4. 5 0
      global/setting.go
  5. 27 6
      utils/base64image.go
  6. 20 0
      utils/extractField.go

+ 135 - 44
app/controller/file.go

@@ -1,33 +1,37 @@
 package controller
 
 import (
+	"bytes"
 	"context"
-	"encoding/base64"
 	"file_upload/app/e"
 	"file_upload/global"
 	"file_upload/simple_zap"
 	"file_upload/utils"
+	"fmt"
 	"github.com/gin-gonic/gin"
 	"github.com/go-playground/validator/v10"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/mongo/options"
 	"go.uber.org/zap"
-	"os"
+	"io/ioutil"
+	"net/http"
+	"path"
 )
 
-type Body struct {
-	Name string
-	Data any
-	Type bool
+type Template struct {
+	Name     string `json:"name" validate:"required"`
+	Data     any    `json:"data" validate:"required"`
+	Type     int    `json:"type" validate:"required"`
+	ImageUrl string `json:"imageUrl" validate:"required"`
 }
 
-// SaveFile 保存文件到MongoDB
+// SaveTemplate 保存文件到MongoDB
 // 参数:
 // - c *gin.Context: Gin框架的上下文对象,用于处理HTTP请求和响应
 // 无返回值
-func SaveFile(c *gin.Context) {
+func SaveTemplate(c *gin.Context) {
 	// 解析请求体中的文件信息
-	file := Body{}
+	file := Template{}
 	err := c.BindJSON(&file)
 	if err != nil {
 		// 日志记录参数解析失败
@@ -51,40 +55,13 @@ func SaveFile(c *gin.Context) {
 		e.ResponseWithMsg(c, e.AlreadyExists, e.AlreadyExists.GetMsg())
 		return
 	}
-	var url string = "https://erp.baozhida.cn/assets/icon-91f5d92f.png"
-	// 准备将文件信息序列化为BSON格式(MongoDB使用的数据格式)
-	m, ok := file.Data.(map[string]any)
-	if ok {
-		elements := m["elements"].([]any)
-		for _, v := range elements {
-			imageurl := v.(map[string]any)["url"]
-			if imageurl != nil {
-				_, data := utils.ParseBase64ImageString(imageurl.(string))
-				decodeString, err := base64.StdEncoding.DecodeString(data)
-				if err != nil {
-					simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "base64解码失败")
-					e.ResponseWithMsg(c, e.ERROR, "图片转换失败")
-					return
-				}
-				optputpath := "./upload" + "/" + file.Name + ".png"
-				create, err := os.Create(optputpath)
-				if err != nil {
-					simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "创建文件失败")
-					e.ResponseWithMsg(c, e.ERROR, "创建文件失败")
-					return
-				}
-				defer create.Close()
-				_, err = create.Write(decodeString)
-				if err != nil {
-					simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "写入文件失败")
-					e.ResponseWithMsg(c, e.ERROR, "写入文件失败")
-					return
-				}
-				simple_zap.WithCtx(context.TODO()).Sugar().Info("文件写入成功")
-				url = "http://localhost:8080/dwonload/" + file.Name + ".png"
-			}
-		}
+	err = utils.ParseBase64ImageString(file.ImageUrl, file.Name)
+	if err != nil {
+		simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "base64解码失败")
+		e.ResponseWithMsg(c, e.ERROR, "图片转换失败")
+		return
 	}
+	var url = global.DownloadSetting.Path + file.Name + ".png"
 	doc := bson.M{
 		"name": file.Name,
 		"type": file.Type,
@@ -104,9 +81,89 @@ func SaveFile(c *gin.Context) {
 	e.ResponseSuccess(c, e.SUCCESS)
 }
 
+//func SaveFile(c *gin.Context) {
+//	// 解析请求体中的文件信息
+//	file := Template{}
+//	err := c.BindJSON(&file)
+//	if err != nil {
+//		// 日志记录参数解析失败
+//		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取参数失败")
+//		// 返回参数解析失败的响应
+//		e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
+//		return
+//	}
+//	// 检查文件是否已存在
+//	filter := bson.M{"name": file.Name}
+//	count, err := global.MongoCon.CountDocuments(context.TODO(), filter)
+//	if err != nil {
+//		// 日志记录查询失败
+//		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "查询文件是否存在失败")
+//		// 返回错误响应
+//		e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+//		return
+//	}
+//	if count > 0 {
+//		// 返回文件已存在的响应
+//		e.ResponseWithMsg(c, e.AlreadyExists, e.AlreadyExists.GetMsg())
+//		return
+//	}
+//	var url string = "https://erp.baozhida.cn/assets/icon-91f5d92f.png"
+//	m, ok := file.Data.(map[string]any)
+//	if ok {
+//		elements := m["elements"].([]any)
+//		for _, v := range elements {
+//			imageurl := v.(map[string]any)["url"]
+//			if imageurl != nil {
+//				_, data := utils.ParseBase64ImageString(imageurl.(string))
+//				decodeString, err := base64.StdEncoding.DecodeString(data)
+//				if err != nil {
+//					simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "base64解码失败")
+//					e.ResponseWithMsg(c, e.ERROR, "图片转换失败")
+//					return
+//				}
+//				// 连接提取出的值
+//				optputpath := "./upload" + "/" + file.Name + ".png"
+//				create, err := os.Create(optputpath)
+//				if err != nil {
+//					simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "创建文件失败")
+//					e.ResponseWithMsg(c, e.ERROR, "创建文件失败")
+//					return
+//				}
+//				defer create.Close()
+//				_, err = create.Write(decodeString)
+//				if err != nil {
+//					simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "写入文件失败")
+//					e.ResponseWithMsg(c, e.ERROR, "写入文件失败")
+//					return
+//				}
+//				// 提取所需字段值
+//				url = "http://localhost:8080/download/" + file.Name + ".png"
+//			}
+//		}
+//	}
+//	doc := bson.M{
+//		"name": file.Name,
+//		"type": file.Type,
+//		"data": file.Data,
+//		"url":  url,
+//	}
+//	// 保存文件到MongoDB
+//	_, err = global.MongoCon.InsertOne(context.TODO(), doc)
+//	if err != nil {
+//		// 日志记录保存文件失败
+//		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "保存文件失败")
+//		// 返回保存文件失败的响应
+//		e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+//		return
+//	}
+//	// 返回文件保存成功的响应
+//	e.ResponseWithMsg(c, e.SUCCESS, url)
+//}
+
+// TemplateItem 获取所有模板
 func TemplateItem(c *gin.Context) {
 	type Types struct {
-		Type bool `json:"type"`
+		Type int `json:"type"`
 	}
 	t := &Types{}
 	c.BindJSON(&t)
@@ -136,6 +193,7 @@ func TemplateItem(c *gin.Context) {
 	e.ResponseSuccess(c, result)
 }
 
+// GetTemplate 获取模板
 func GetTemplate(c *gin.Context) {
 	name := c.Query("name")
 	if name == "" {
@@ -178,7 +236,7 @@ func SearchTemplate(c *gin.Context) {
 	validate := validator.New()
 	validate.Var("name", "required")
 	if query == "" {
-		e.ResponseWithMsg(c, e.ERROR, "参数错误")
+		e.ResponseWithMsg(c, e.ERROR, "参数不弄为空")
 		return
 	}
 	//result, err := global.Rdb.Keys(context.Background(), "*"+query+"*").Result()
@@ -198,3 +256,36 @@ func SearchTemplate(c *gin.Context) {
 	err = cursor.All(context.Background(), &result)
 	e.ResponseSuccess(c, result)
 }
+func GetImage(c *gin.Context) {
+	name := c.Query("name")
+	if name == "" {
+		e.ResponseWithMsg(c, e.ERROR, "参数错误")
+		return
+	}
+	// 指定图片所在目录的路径
+	imageDirPath := "./upload"
+
+	// 构建图片文件的完整路径
+	imageFilePath := fmt.Sprintf("%s/%s", imageDirPath, name)
+
+	file, err := ioutil.ReadFile(imageFilePath)
+	if err != nil {
+		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取图片失败")
+		e.ResponseWithMsg(c, e.ERROR, "获取图片失败")
+		return
+	}
+	// 根据文件扩展名确定 Content-Type
+	ext := path.Ext(name)
+	contentType := ""
+	switch ext {
+	case ".jpg", ".jpeg":
+		contentType = "image/jpeg"
+	case ".png":
+		contentType = "image/png"
+	// 添加更多类型...
+	default:
+		c.AbortWithStatus(http.StatusUnsupportedMediaType)
+		return
+	}
+	c.DataFromReader(http.StatusOK, int64(len(file)), contentType, bytes.NewReader(file), nil)
+}

+ 4 - 2
app/router.go

@@ -15,12 +15,14 @@ func InitRouter() error {
 	//记录日志
 	engine.Use(middleware.Cors())
 	//engine.GET("/swagger/*any", ginSwagger.DisablingWrapHandler(swaggerFiles.Handler, global.SwaggerSetting.Enable))
-	engine.Use(static.Serve("/dwonload/", static.LocalFile("./upload", true)))
+	engine.Use(static.Serve("/CAD/download", static.LocalFile("./upload", true)))
 	gin.SetMode(global.ServerSetting.Mode)
 	group := engine.Group("/api")
 	group.Use(middleware.Cors())
 	group.DELETE("/template", controller.DeleteTemplate)
-	group.POST("/savefile", controller.SaveFile)
+	group.POST("/saveTemplate", controller.SaveTemplate)
+	group.GET("/getImage", controller.GetImage)
+	//group.POST("/savefile", controller.SaveFile)
 	group.POST("/template", controller.TemplateItem)
 	group.GET("/template", controller.GetTemplate)
 	group.GET("/search", controller.SearchTemplate)

+ 3 - 0
configs/config.yaml

@@ -44,6 +44,9 @@ mongo:
     url: "mongodb://bzd_file:X7EeS6Yja5tGfXBR@116.204.6.184:27017/bzd_file"
     password: "123456"
     db: 0
+download:
+  # 存储路径
+  path: "http://localhost:8080/CAD/download/"
 swag:
   # 将环境变量 NAME_OF_ENV_VARIABLE设置为任意值,则 /swagger/*any 返回404响应
   enable: "NAME_OF_ENV_VARIABLE"

+ 5 - 0
global/setting.go

@@ -53,6 +53,9 @@ type Mongo struct {
 	Password string `json:"password"`
 	DB       int    `json:"db"`
 }
+type Download struct {
+	Path string `json:"path"`
+}
 
 var (
 	DatabaseSetting *DatabaseSettingS
@@ -63,6 +66,7 @@ var (
 	RedisSetting    *Redis
 	SwaggerSetting  *Swagger
 	MongoSetting    *Mongo
+	DownloadSetting *Download
 )
 
 // SetupSetting 读取配置到全局变量
@@ -76,6 +80,7 @@ func SetupSetting() error {
 	err = s.ReadSection("Redis", &RedisSetting)
 	err = s.ReadSection("Swagger", &SwaggerSetting)
 	err = s.ReadSection("Mongo", &MongoSetting)
+	err = s.ReadSection("Download", &DownloadSetting)
 	if err != nil {
 		return err
 	}

+ 27 - 6
utils/base64image.go

@@ -1,17 +1,38 @@
 package utils
 
-import "strings"
+import (
+	"context"
+	"encoding/base64"
+	"file_upload/simple_zap"
+	"os"
+	"strings"
+)
 
-func ParseBase64ImageString(input string) (contentType string, data string) {
+func ParseBase64ImageString(input, name string) error {
 	parts := strings.Split(input, ",")
 	if len(parts) < 2 {
 		panic("Invalid Base64 image string")
 	}
-
 	contentTypePart := strings.TrimSpace(parts[0])
 	contentTypeParts := strings.Split(contentTypePart, ";")
-	contentType = strings.TrimSpace(contentTypeParts[0])
+	_ = strings.TrimSpace(contentTypeParts[0])
 
-	data = parts[1]
-	return contentType, data
+	data := parts[1]
+	decodeString, err := base64.StdEncoding.DecodeString(data)
+	if err != nil {
+		return err
+	}
+	optputpath := "./upload" + "/" + name + ".png"
+	create, err := os.Create(optputpath)
+	if err != nil {
+		simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "创建文件失败")
+		return err
+	}
+	defer create.Close()
+	_, err = create.Write(decodeString)
+	if err != nil {
+		simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "写入文件失败")
+		return err
+	}
+	return err
 }

+ 20 - 0
utils/extractField.go

@@ -0,0 +1,20 @@
+package utils
+
+import "strings"
+
+func ExtractField(input, field string) string {
+	idx := strings.Index(input, field)
+	if idx == -1 {
+		return "" // 或者返回一个默认值,抛出错误等,根据实际情况处理
+	}
+
+	start := idx + len(field)
+	end := strings.IndexByte(input[start:], '&')
+	if end == -1 {
+		end = len(input) // 没有找到下一个 &, 则提取到字符串末尾
+	} else {
+		end += start
+	}
+
+	return input[start:end]
+}