SysAttachmentController.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. "crypto/sha1"
  8. "io/ioutil"
  9. "strconv"
  10. "strings"
  11. "errors"
  12. "bytes"
  13. "path"
  14. "mime"
  15. "time"
  16. "fmt"
  17. "io"
  18. "os"
  19. )
  20. // _Upload
  21. // @Title _Upload
  22. // @Description 上传文件
  23. // @Success 200 {object} Account
  24. // @Failure 403 :id is empty
  25. func SysAttachment_Upload(c *entitys.CtrlContext) {
  26. attach, err := doUpload2(c)
  27. if err == nil {
  28. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attach.Id})
  29. syslogs.Debug("上传附件成功:", attach.Name, attach.Size)
  30. } else {
  31. c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
  32. }
  33. }
  34. // _Download
  35. // @Title _Download
  36. // @Description 下载文件
  37. // @Param id string false "文件ID"
  38. // @Success 200 {object} Account
  39. // @Failure 403 :id is empty
  40. func SysAttachment_Download(c *entitys.CtrlContext) {
  41. attrId := c.Ctx.Query("id")
  42. //gt := c.Ctx.Query("get_thumb")
  43. var attach sysmodel.SysAttachment
  44. exist, err := c.Db.SqlMapClient("selectone_sys_attachment", &map[string]interface{}{"id": attrId}).Get(&attach)
  45. if !exist && err == nil {
  46. err = errors.New("record does not exist")
  47. }
  48. if err != nil {
  49. syslogs.Error("获取附件出错了:", err)
  50. c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
  51. return
  52. }
  53. domain := c.Ctx.GetString("domain")
  54. filePath := fmt.Sprintf("files/%s/%s", domain, attach.Id)
  55. file, err := os.Open(filePath)
  56. if err != nil {
  57. c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
  58. return
  59. }
  60. defer file.Close()
  61. /*durl := attach.Url
  62. if gt != "" {
  63. durl += "?getthumb=" + gt
  64. }
  65. resultBody, err := sysutils.GetFile(durl)
  66. if err != nil {
  67. syslogs.Error("下载附件出错了:", err)
  68. c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
  69. return
  70. }
  71. defer resultBody.Close()*/
  72. bbuf := bytes.NewBuffer([]byte{})
  73. c.Ctx.Header("Content-Disposition", "attachment;filename=\""+sysutils.FormatForBrowse(c.Ctx.Request.UserAgent(), attach.Name)+"\"")
  74. c.Ctx.Header("Content-Type", strings.Replace(mime.TypeByExtension(attach.Ext), "charset=utf-8", "", -1))
  75. buff := make([]byte, 1024)
  76. var ssize int64 = 0
  77. for {
  78. n, err := io.ReadFull(file, buff)
  79. if err != nil && err != io.ErrUnexpectedEOF && err != io.EOF {
  80. syslogs.Error("下载附件出错了:", err)
  81. c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
  82. return
  83. }
  84. if n <= 0 {
  85. break
  86. }
  87. bbuf.Write(buff[:n])
  88. ssize += int64(n)
  89. }
  90. c.Ctx.Header("Content-Length", strconv.FormatInt(ssize, 10))
  91. _, err = c.Ctx.Writer.Write(bbuf.Bytes())
  92. if err != nil {
  93. syslogs.Error("输出流断开:", attach.Name, attach.Size)
  94. c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
  95. return
  96. }
  97. syslogs.Debug("下载附件成功:", attach.Name, attach.Size)
  98. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attach.Id})
  99. }
  100. // _Delete
  101. // @Title _Delete
  102. // @Description 删除文件
  103. // @Param id string false "文件ID"
  104. // @Success 200 {object} Account
  105. // @Failure 403 :id is empty
  106. func SysAttachment_Delete(c *entitys.CtrlContext) {
  107. attrId := c.Ctx.Query("id")
  108. attach := &sysmodel.SysAttachment{}
  109. attach.Id = attrId
  110. _, err := c.Db.Id(attrId).Delete(attach)
  111. if err != nil {
  112. syslogs.Error("删除附件出错了:", err)
  113. c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
  114. return
  115. }
  116. syslogs.Debug("删除附件:", attrId)
  117. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attrId})
  118. }
  119. func doUpload(c *entitys.CtrlContext) (*sysmodel.SysAttachment, error) {
  120. file, fInfo, err := c.Ctx.Request.FormFile("file")
  121. if err != nil {
  122. syslogs.Error("上传出错了:", err)
  123. return nil, err
  124. }
  125. download, hash, length, err := sysutils.PostFile(file)
  126. if err != nil {
  127. return nil, err
  128. }
  129. userId := c.Ctx.GetString("user_id")
  130. attach := &sysmodel.SysAttachment{}
  131. attach.Id = sysutils.NewUUID()
  132. attach.Name = fInfo.Filename
  133. attach.Size = length
  134. attach.Url = download
  135. attach.CreateBy = userId
  136. attach.CreateTime = time.Now()
  137. attach.Ext = path.Ext(attach.Name)
  138. attach.Hash = hash
  139. _, err = c.Db.InsertOne(attach)
  140. if err != nil {
  141. syslogs.Error("保存附件出错了:", err)
  142. return nil, err
  143. }
  144. return attach, nil
  145. }
  146. func doUpload2(c *entitys.CtrlContext) (*sysmodel.SysAttachment, error) {
  147. file, fInfo, err := c.Ctx.Request.FormFile("file")
  148. if err != nil {
  149. syslogs.Error("上传出错了:", err)
  150. return nil, err
  151. }
  152. defer file.Close()
  153. domain := c.Ctx.GetString("domain")
  154. fileDir := fmt.Sprintf("files/%s/", domain)
  155. if err = mkdir(fileDir); err != nil {
  156. syslogs.Info("文件夹创建失败")
  157. return nil, err
  158. }
  159. attachId := sysutils.NewUUID()
  160. filePath := fileDir + attachId
  161. fW, err := os.Create(filePath)
  162. if err != nil {
  163. syslogs.Info("文件创建失败")
  164. return nil, err
  165. }
  166. defer fW.Close()
  167. length, err := io.Copy(fW, file)
  168. if err != nil {
  169. syslogs.Info("文件保存失败")
  170. return nil, err
  171. }
  172. userId := c.Ctx.GetString("user_id")
  173. attach := &sysmodel.SysAttachment{}
  174. attach.Id = attachId
  175. attach.Name = fInfo.Filename
  176. attach.Size = int32(length)
  177. attach.Url = "/api/v1/sys_attachment/download?id=" + attach.Id
  178. attach.CreateBy = userId
  179. attach.CreateTime = time.Now()
  180. attach.Ext = path.Ext(attach.Name)
  181. attach.Hash = FileHasH(filePath)
  182. _, err = c.Db.InsertOne(attach)
  183. if err != nil {
  184. syslogs.Error("保存附件出错了:", err)
  185. return nil, err
  186. }
  187. return attach, nil
  188. }
  189. func mkdir(dir string) error {
  190. _, err := os.Stat(dir)
  191. if err != nil {
  192. err = os.MkdirAll(dir, os.ModePerm)
  193. }
  194. return err
  195. }
  196. func FileHasH(filePath string) string {
  197. bytes, err := ioutil.ReadFile(filePath)
  198. if err == nil && len(bytes) > 0 {
  199. return fmt.Sprintf("%x", sha1.Sum(bytes))
  200. }
  201. return ""
  202. }
  203. func __none_func_sys_attachment__(params ... interface{}) bool {
  204. return true
  205. }