file.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. package controller
  2. import (
  3. "bytes"
  4. "context"
  5. "file_upload/app/e"
  6. "file_upload/global"
  7. "file_upload/simple_zap"
  8. "file_upload/utils"
  9. "fmt"
  10. "github.com/gin-gonic/gin"
  11. "github.com/go-playground/validator/v10"
  12. "go.mongodb.org/mongo-driver/bson"
  13. "go.mongodb.org/mongo-driver/mongo/options"
  14. "go.uber.org/zap"
  15. "io/ioutil"
  16. "net/http"
  17. "path"
  18. )
  19. type Template struct {
  20. Name string `json:"name" validate:"required"`
  21. Data any `json:"data" validate:"required"`
  22. Type int `json:"type" validate:"required"`
  23. ImageUrl string `json:"imageUrl" validate:"required"`
  24. }
  25. // SaveTemplate 保存文件到MongoDB
  26. // 参数:
  27. // - c *gin.Context: Gin框架的上下文对象,用于处理HTTP请求和响应
  28. // 无返回值
  29. func SaveTemplate(c *gin.Context) {
  30. // 解析请求体中的文件信息
  31. file := Template{}
  32. err := c.BindJSON(&file)
  33. if err != nil {
  34. // 日志记录参数解析失败
  35. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取参数失败")
  36. // 返回参数解析失败的响应
  37. e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
  38. return
  39. }
  40. // 检查文件是否已存在
  41. filter := bson.M{"name": file.Name}
  42. count, err := global.MongoCon.CountDocuments(context.TODO(), filter)
  43. if err != nil {
  44. // 日志记录查询失败
  45. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "查询文件是否存在失败")
  46. // 返回错误响应
  47. e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  48. return
  49. }
  50. if count > 0 {
  51. // 返回文件已存在的响应
  52. e.ResponseWithMsg(c, e.AlreadyExists, e.AlreadyExists.GetMsg())
  53. return
  54. }
  55. err = utils.ParseBase64ImageString(file.ImageUrl, file.Name)
  56. if err != nil {
  57. simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "base64解码失败")
  58. e.ResponseWithMsg(c, e.ERROR, "图片转换失败")
  59. return
  60. }
  61. var url = global.DownloadSetting.Path + file.Name + ".png"
  62. doc := bson.M{
  63. "name": file.Name,
  64. "type": file.Type,
  65. "data": file.Data,
  66. "url": url,
  67. }
  68. // 保存文件到MongoDB
  69. _, err = global.MongoCon.InsertOne(context.TODO(), doc)
  70. if err != nil {
  71. // 日志记录保存文件失败
  72. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "保存文件失败")
  73. // 返回保存文件失败的响应
  74. e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  75. return
  76. }
  77. // 返回文件保存成功的响应
  78. e.ResponseSuccess(c, e.SUCCESS)
  79. }
  80. //func SaveFile(c *gin.Context) {
  81. // // 解析请求体中的文件信息
  82. // file := Template{}
  83. // err := c.BindJSON(&file)
  84. // if err != nil {
  85. // // 日志记录参数解析失败
  86. // simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取参数失败")
  87. // // 返回参数解析失败的响应
  88. // e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
  89. // return
  90. // }
  91. // // 检查文件是否已存在
  92. // filter := bson.M{"name": file.Name}
  93. // count, err := global.MongoCon.CountDocuments(context.TODO(), filter)
  94. // if err != nil {
  95. // // 日志记录查询失败
  96. // simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "查询文件是否存在失败")
  97. // // 返回错误响应
  98. // e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  99. // return
  100. // }
  101. // if count > 0 {
  102. // // 返回文件已存在的响应
  103. // e.ResponseWithMsg(c, e.AlreadyExists, e.AlreadyExists.GetMsg())
  104. // return
  105. // }
  106. // var url string = "https://erp.baozhida.cn/assets/icon-91f5d92f.png"
  107. // m, ok := file.Data.(map[string]any)
  108. // if ok {
  109. // elements := m["elements"].([]any)
  110. // for _, v := range elements {
  111. // imageurl := v.(map[string]any)["url"]
  112. // if imageurl != nil {
  113. // _, data := utils.ParseBase64ImageString(imageurl.(string))
  114. // decodeString, err := base64.StdEncoding.DecodeString(data)
  115. // if err != nil {
  116. // simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "base64解码失败")
  117. // e.ResponseWithMsg(c, e.ERROR, "图片转换失败")
  118. // return
  119. // }
  120. // // 连接提取出的值
  121. // optputpath := "./upload" + "/" + file.Name + ".png"
  122. // create, err := os.Create(optputpath)
  123. // if err != nil {
  124. // simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "创建文件失败")
  125. // e.ResponseWithMsg(c, e.ERROR, "创建文件失败")
  126. // return
  127. // }
  128. // defer create.Close()
  129. // _, err = create.Write(decodeString)
  130. // if err != nil {
  131. // simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "写入文件失败")
  132. // e.ResponseWithMsg(c, e.ERROR, "写入文件失败")
  133. // return
  134. // }
  135. // // 提取所需字段值
  136. // url = "http://localhost:8080/download/" + file.Name + ".png"
  137. // }
  138. // }
  139. // }
  140. // doc := bson.M{
  141. // "name": file.Name,
  142. // "type": file.Type,
  143. // "data": file.Data,
  144. // "url": url,
  145. // }
  146. // // 保存文件到MongoDB
  147. // _, err = global.MongoCon.InsertOne(context.TODO(), doc)
  148. // if err != nil {
  149. // // 日志记录保存文件失败
  150. // simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "保存文件失败")
  151. // // 返回保存文件失败的响应
  152. // e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  153. // return
  154. // }
  155. // // 返回文件保存成功的响应
  156. // e.ResponseWithMsg(c, e.SUCCESS, url)
  157. //}
  158. // TemplateItem 获取所有模板
  159. func TemplateItem(c *gin.Context) {
  160. type Types struct {
  161. Type int `json:"type"`
  162. }
  163. t := &Types{}
  164. c.BindJSON(&t)
  165. filter := bson.M{
  166. "type": t.Type,
  167. }
  168. var result []bson.M
  169. opts := options.Find()
  170. opts.SetProjection(bson.M{
  171. "_id": 0,
  172. "data": 0,
  173. })
  174. cur, err := global.MongoCon.Find(context.Background(), filter, opts)
  175. if err != nil {
  176. // 记录日志并返回错误信息
  177. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
  178. e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  179. return
  180. }
  181. err = cur.All(context.Background(), &result)
  182. if err != nil {
  183. // 记录日志并返回错误信息
  184. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
  185. e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  186. return
  187. }
  188. e.ResponseSuccess(c, result)
  189. }
  190. // GetTemplate 获取模板
  191. func GetTemplate(c *gin.Context) {
  192. name := c.Query("name")
  193. if name == "" {
  194. e.ResponseWithMsg(c, e.ERROR, "参数错误")
  195. return
  196. }
  197. var result map[string]interface{}
  198. err := global.MongoCon.FindOne(context.Background(), bson.M{"name": name}).Decode(&result)
  199. if err != nil {
  200. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取文件失败")
  201. e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
  202. return
  203. }
  204. e.ResponseSuccess(c, result)
  205. }
  206. // DeleteTemplate 删除模板
  207. func DeleteTemplate(c *gin.Context) {
  208. name := c.Query("name")
  209. if name == "" {
  210. e.ResponseWithMsg(c, e.ERROR, "参数错误")
  211. return
  212. }
  213. one, err := global.MongoCon.DeleteOne(context.Background(), bson.M{"name": name})
  214. //err := global.Rdb.Del(context.Background(), name).Err()
  215. if err != nil {
  216. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "删除文件失败")
  217. e.ResponseWithMsg(c, e.ERROR, "删除文件失败")
  218. return
  219. }
  220. if one.DeletedCount > 0 {
  221. e.ResponseSuccess(c, one)
  222. return
  223. }
  224. e.ResponseWithMsg(c, e.ERROR, "删除文件失败")
  225. }
  226. func SearchTemplate(c *gin.Context) {
  227. query := c.Query("name")
  228. validate := validator.New()
  229. validate.Var("name", "required")
  230. if query == "" {
  231. e.ResponseWithMsg(c, e.ERROR, "参数不弄为空")
  232. return
  233. }
  234. //result, err := global.Rdb.Keys(context.Background(), "*"+query+"*").Result()
  235. fileter := bson.M{"name": bson.M{"$regex": query}}
  236. var result []bson.M
  237. find := options.Find()
  238. find.SetProjection(bson.M{
  239. "_id": 0,
  240. "data": 0,
  241. })
  242. cursor, err := global.MongoCon.Find(context.Background(), fileter, find)
  243. if err != nil {
  244. simple_zap.Logger.Error("查询失败", zap.Error(err))
  245. e.ResponseWithMsg(c, e.ERROR, "查询失败")
  246. return
  247. }
  248. err = cursor.All(context.Background(), &result)
  249. e.ResponseSuccess(c, result)
  250. }
  251. func GetImage(c *gin.Context) {
  252. name := c.Query("name")
  253. if name == "" {
  254. e.ResponseWithMsg(c, e.ERROR, "参数错误")
  255. return
  256. }
  257. // 指定图片所在目录的路径
  258. imageDirPath := "./upload"
  259. // 构建图片文件的完整路径
  260. imageFilePath := fmt.Sprintf("%s/%s", imageDirPath, name)
  261. file, err := ioutil.ReadFile(imageFilePath)
  262. if err != nil {
  263. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取图片失败")
  264. e.ResponseWithMsg(c, e.ERROR, "获取图片失败")
  265. return
  266. }
  267. // 根据文件扩展名确定 Content-Type
  268. ext := path.Ext(name)
  269. contentType := ""
  270. switch ext {
  271. case ".jpg", ".jpeg":
  272. contentType = "image/jpeg"
  273. case ".png":
  274. contentType = "image/png"
  275. // 添加更多类型...
  276. default:
  277. c.AbortWithStatus(http.StatusUnsupportedMediaType)
  278. return
  279. }
  280. c.DataFromReader(http.StatusOK, int64(len(file)), contentType, bytes.NewReader(file), nil)
  281. }