SysAttachmentController.go 4.0 KB

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