SysAttachmentController.go 3.9 KB

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