123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package controllers
  2. import (
  3. "bytes"
  4. "errors"
  5. "spaceofcheng/services/utils"
  6. "strconv"
  7. "time"
  8. "net/http"
  9. "net/url"
  10. )
  11. // FileUpload 文件上传
  12. func (c *BaseController) FileUpload() {
  13. file, err := c.uploadFileToOSS("file")
  14. if err != nil {
  15. c.ResponseError(err, http.StatusInternalServerError)
  16. }
  17. c.ResponseJSON(map[string]interface{}{
  18. "url": file,
  19. })
  20. }
  21. func (c *BaseController) uploadFileToOSS(field string) (string, error) {
  22. aliConf, ok := c.Configer[AliYunConf]
  23. if !ok {
  24. return "", errors.New("没有找到阿里云相关配置")
  25. }
  26. endpoint := aliConf.String("oss::Endpoint")
  27. accessKeyID := aliConf.String("oss::AccessKeyId")
  28. accessKeySecret := aliConf.String("oss::AccessKeySecret")
  29. bucket := aliConf.String("oss::Bucket")
  30. aliCli, err := utils.GetOssClient(endpoint, accessKeyID, accessKeySecret)
  31. if err != nil {
  32. return "", err
  33. }
  34. fNameExtra := strconv.FormatInt(time.Now().Unix(), 10)
  35. fileURL, err := utils.UploadFileToBucket(aliCli, c.Ctx.Request, bucket, field, fNameExtra)
  36. if err != nil {
  37. return "", err
  38. }
  39. return fileURL, nil
  40. }
  41. // SaveToExcel 保存文件到 excel
  42. // 文件不落地, 对内存开销比较大, 如果文件过大, 服务可能会崩掉
  43. func (c *BaseController) SaveToExcel(fn string, excel *utils.TinyXLSXEngine) {
  44. var buf bytes.Buffer
  45. if err := excel.Write(&buf); err != nil {
  46. utils.LogError("写 xlsx buffer 失败: " + err.Error())
  47. c.ResponseError(errors.New("生成 excel 异常, 请重试"))
  48. }
  49. c.Ctx.Output.Header("Content-Disposition", "attachment; filename="+url.QueryEscape(fn))
  50. c.Ctx.Output.Header("Content-Description", "File Transfer")
  51. c.Ctx.Output.ContentType(".xlsx")
  52. c.Ctx.Output.Header("Content-Transfer-Encoding", "binary")
  53. c.Ctx.Output.Header("Expires", "0")
  54. c.Ctx.Output.Header("Cache-Control", "must-revalidate")
  55. c.Ctx.Output.Header("Pragma", "public")
  56. r := bytes.NewReader(buf.Bytes())
  57. http.ServeContent(c.Ctx.ResponseWriter, c.Ctx.Request, fn, time.Now().Local(), r)
  58. c.destroyContext(true)
  59. c.StopRun()
  60. }
  61. // UploadBase64Image Upload base64-image to ali-oss
  62. // @Title Upload image to ali-oss
  63. // @Description 上传base64图片到阿里云
  64. // @Param UpImgStr form string true "图片控件name"
  65. // @Success 200 { Url } 图片URL
  66. // @Failure >300 error message
  67. func (c *BaseController) UploadBase64Image() {
  68. base64Str, err := url.QueryUnescape(c.GetString("base64str"))
  69. if err != nil {
  70. c.ResponseError(utils.LogError("上传 Base64 图片失败", err))
  71. }
  72. imgURL, err := c.uploadStringToAliOSS(base64Str)
  73. if err != nil {
  74. c.ResponseError(err)
  75. }
  76. resp := map[string]interface{}{
  77. "url": imgURL,
  78. }
  79. c.ResponseJSON(resp)
  80. }
  81. // func (c *BaseController) UploadBase64ImageGzip() {
  82. // base64Gzip := c.GetString("base64str")
  83. // baseZip := []byte(base64Gzip)
  84. // reader, err := gzip.NewReader(bytes.NewReader(baseZip))
  85. // if err != nil {
  86. // c.ResponseError(err)
  87. // }
  88. // baseByte, err := ioutil.ReadAll(reader)
  89. // baseStr := string(baseByte)
  90. // base64Str, err := url.QueryUnescape(baseStr)
  91. // if err != nil {
  92. // c.ResponseError(utils.LogError("上传 Base64 图片失败", err))
  93. // }
  94. // imgURL, err := c.uploadStringToAliOSS(base64Str)
  95. // if err != nil {
  96. // c.ResponseError(err)
  97. // }
  98. // resp := map[string]interface{}{
  99. // "url": imgURL,
  100. // }
  101. // c.ResponseJSON(resp)
  102. // }
  103. // uploadStringToAliOSS 上传文件到阿里云
  104. func (c *BaseController) uploadStringToAliOSS(fStr string) (string, error) {
  105. aliConf, ok := c.Configer[AliYunConf]
  106. if !ok {
  107. return "", errors.New("没有找到阿里云相关配置")
  108. }
  109. endpoint := aliConf.String("oss::Endpoint")
  110. accessKeyID := aliConf.String("oss::AccessKeyId")
  111. accessKeySecret := aliConf.String("oss::AccessKeySecret")
  112. bucket := aliConf.String("oss::Bucket")
  113. aliCli, err := utils.GetOssClient(endpoint, accessKeyID, accessKeySecret)
  114. if err != nil {
  115. return "", utils.LogError("配置阿里云客户端失败", err)
  116. }
  117. fileURL, err := utils.UploadStringToBucket(aliCli, bucket, fStr)
  118. if err != nil {
  119. return "", utils.LogError("上传文件到阿里云失败", err)
  120. }
  121. return fileURL, nil
  122. }
  123. // SaveNetFilesToZip 压缩远程文件并下载
  124. func (c *BaseController) SaveNetFilesToZip(files []utils.NetFile, zf string) {
  125. var buf bytes.Buffer
  126. err := utils.ZipNetFiles(files, &buf)
  127. if err != nil {
  128. c.ResponseError(errors.New("下载 zip 文件失败"))
  129. }
  130. c.Ctx.Output.Header("Content-Disposition", "attachment; filename="+url.QueryEscape(zf))
  131. c.Ctx.Output.Header("Content-Description", "File Transfer")
  132. c.Ctx.Output.ContentType("application/zip")
  133. c.Ctx.Output.Header("Content-Transfer-Encoding", "binary")
  134. c.Ctx.Output.Header("Expires", "0")
  135. c.Ctx.Output.Header("Cache-Control", "must-revalidate")
  136. c.Ctx.Output.Header("Pragma", "public")
  137. r := bytes.NewReader(buf.Bytes())
  138. http.ServeContent(c.Ctx.ResponseWriter, c.Ctx.Request, zf, time.Now().Local(), r)
  139. c.destroyContext(true)
  140. c.StopRun()
  141. }