SysAttachmentController.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package partial
  2. import (
  3. "bytes"
  4. "fmt"
  5. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  6. "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs"
  7. "io"
  8. "mime"
  9. "strconv"
  10. "strings"
  11. sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  12. "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
  13. "log"
  14. "path"
  15. "time"
  16. )
  17. // _Upload
  18. // @Title _Upload
  19. // @Description 上传文件
  20. // @Success 200 {object} models.Account
  21. // @Failure 403 :id is empty
  22. func SysAttachment_Upload(c *entitys.CtrlContext) {
  23. // 单文件
  24. file, _ := c.Ctx.FormFile("file")
  25. f, _ := file.Open()
  26. log.Println(file.Filename)
  27. download, hash, length, err := utils.PostFile(f)
  28. if err != nil {
  29. logs.Error("PostFile err: ", err.Error())
  30. c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
  31. return
  32. }
  33. attach := &sysmodel.SysAttachment{}
  34. attach.Id = utils.NewUUID()
  35. attach.Name = file.Filename
  36. attach.Size = length
  37. attach.Url = download
  38. attach.CreateTime = time.Now()
  39. attach.Ext = path.Ext(attach.Name)
  40. attach.Hash = hash
  41. //插入数据库
  42. _, err = c.Db.Insert(attach)
  43. if err != nil {
  44. logs.Error("Insert Attachment err: ", err.Error())
  45. c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
  46. return
  47. }
  48. ret := __none_func_sys_attachment__()
  49. if ret {
  50. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attach.Id})
  51. } else {
  52. c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
  53. }
  54. }
  55. // _Download
  56. // @Title _Download
  57. // @Description 下载文件
  58. // @Param id false "文件ID"
  59. // @Success 200 {object} models.Account
  60. // @Failure 403 :id is empty
  61. func SysAttachment_Download(c *entitys.CtrlContext) {
  62. gt := c.Ctx.GetString("get_thumb")
  63. attrId := c.Ctx.Param("attrId")
  64. fmt.Println("--------", attrId)
  65. var attach sysmodel.SysAttachment
  66. _, err := c.Db.Id(attrId).Get(&attach)
  67. if err != nil {
  68. logs.Error("获取附件出错了:", err)
  69. c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
  70. return
  71. }
  72. logs.Debug("开始下载附件:", attach.Name, attach.Size)
  73. durl := attach.Url
  74. if gt != "" {
  75. durl += "?getthumb=" + gt
  76. }
  77. resultBody, err := utils.GetFile(durl)
  78. if err != nil {
  79. logs.Error("下载附件出错了:", err)
  80. c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
  81. return
  82. }
  83. defer resultBody.Close()
  84. bbuf := bytes.NewBuffer([]byte{})
  85. c.Ctx.Header("Content-Disposition", "attachment;filename=\""+utils.FormatForBrowse(c.Ctx.Request.UserAgent(), attach.Name)+"\"")
  86. c.Ctx.Header("Content-Type", strings.Replace(mime.TypeByExtension(attach.Ext), "charset=utf-8", "", -1))
  87. buff := make([]byte, 1024)
  88. var ssize int64 = 0
  89. for {
  90. n, err := io.ReadFull(resultBody, buff)
  91. if err != nil && err != io.ErrUnexpectedEOF && err != io.EOF {
  92. logs.Error("下载附件出错了:", err)
  93. c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
  94. return
  95. }
  96. if n <= 0 {
  97. break
  98. }
  99. bbuf.Write(buff[:n])
  100. ssize += int64(n)
  101. }
  102. c.Ctx.Header("Content-Length", strconv.FormatInt(ssize, 10))
  103. _, err = c.Ctx.Writer.Write(bbuf.Bytes())
  104. if err != nil {
  105. logs.Error("输出流断开:", attach.Name, attach.Size)
  106. c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
  107. return
  108. }
  109. logs.Debug("下载附件成功:", attach.Name, attach.Size)
  110. ret := __none_func_sys_attachment__(attrId)
  111. if ret {
  112. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
  113. } else {
  114. c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
  115. }
  116. }
  117. // _Delete
  118. // @Title _Delete
  119. // @Description 删除文件
  120. // @Param id false "文件ID"
  121. // @Success 200 {object} models.Account
  122. // @Failure 403 :id is empty
  123. func SysAttachment_Delete(c *entitys.CtrlContext) {
  124. attrId := c.Ctx.Param("attrId")
  125. var attach sysmodel.SysAttachment
  126. _, err := c.Db.ID(attrId).Delete(&attach)
  127. if err != nil {
  128. c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
  129. return
  130. }
  131. ret := __none_func_sys_attachment__(attrId)
  132. if ret {
  133. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
  134. } else {
  135. c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
  136. }
  137. }
  138. func __none_func_sys_attachment__(params ...interface{}) bool {
  139. return true
  140. }