SysAttachmentController.go 3.9 KB

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