units.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package src
  2. import (
  3. "archive/zip"
  4. "crypto/md5"
  5. "crypto/rand"
  6. "encoding/base64"
  7. "encoding/hex"
  8. "encoding/json"
  9. "fmt"
  10. "github.com/sirupsen/logrus"
  11. "io"
  12. "os"
  13. "path/filepath"
  14. "strconv"
  15. "strings"
  16. )
  17. // 格式化文件大小
  18. func formatSize(size float64, unit int) string {
  19. // 递归得出size的单位
  20. if int(size)/1024 != 0 {
  21. unit := unit + 1
  22. return formatSize(size/1024, unit)
  23. }
  24. // 将数字进行处理
  25. num := handleNum(size)
  26. // 添加单位并返回
  27. if unit == 0 {
  28. return num + "B"
  29. } else if unit == 1 {
  30. return num + "KB"
  31. } else if unit == 2 {
  32. return num + "MB"
  33. } else if unit == 3 {
  34. return num + "GB"
  35. } else if unit == 4 {
  36. return num + "TB"
  37. }
  38. return num + "?B"
  39. }
  40. // 处理数字
  41. func handleNum(num float64) string {
  42. // 如果没有小数位 直接返回整数位即可
  43. if int(num*100)%100 == 0 {
  44. return strconv.Itoa(int(num))
  45. }
  46. return fmt.Sprintf("%.2f", num)
  47. }
  48. // 计算文件大小
  49. func dirSize(dir string) int64 {
  50. var size int64
  51. // 遍历文件夹下的所有文件和子文件夹
  52. err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  53. if err != nil {
  54. logrus.Error("计算文件夹大小发生异常, 异常为: ", err)
  55. }
  56. // 如果是文件,则累加文件大小
  57. if !info.IsDir() {
  58. size += info.Size()
  59. }
  60. return nil
  61. })
  62. if err != nil {
  63. logrus.Error("计算文件夹大小发生异常, 异常为: ", err)
  64. return 0
  65. }
  66. return size
  67. }
  68. // 生成hash
  69. func generateHash(str string, genLen int) string {
  70. data := []byte(str)
  71. var hash []byte
  72. h := md5.New()
  73. h.Write(data)
  74. hash = h.Sum(nil)
  75. if genLen != -1 {
  76. return hex.EncodeToString(hash)[:genLen]
  77. }
  78. return hex.EncodeToString(hash)
  79. }
  80. // 生成sessionId
  81. func generateSessionID() string {
  82. // 创建一个32字节的随机字节数组
  83. b := make([]byte, 32)
  84. _, err := rand.Read(b)
  85. if err != nil {
  86. logrus.Error("sessionId生成发生异常, 异常为: ", err)
  87. return ""
  88. }
  89. // 将随机字节数组编码为URL安全的Base64字符串
  90. return base64.URLEncoding.EncodeToString(b)
  91. }
  92. // 创建目录压缩
  93. func createZipDir(dir, zipFile string) {
  94. // 创建一个新的 zip 文件
  95. newZipFile, err := os.Create(zipFile)
  96. if err != nil {
  97. logrus.Error("压缩文件创建发生异常, 异常为: ", err)
  98. return
  99. }
  100. defer func(newZipFile *os.File) {
  101. err = newZipFile.Close()
  102. if err != nil {
  103. logrus.Error("压缩文件创建发生异常, 异常为: ", err)
  104. return
  105. }
  106. }(newZipFile)
  107. // 创建一个 zip.Writer
  108. zipWriter := zip.NewWriter(newZipFile)
  109. defer func(zipWriter *zip.Writer) {
  110. err = zipWriter.Close()
  111. if err != nil {
  112. logrus.Error("压缩文件创建发生异常, 异常为: ", err)
  113. return
  114. }
  115. }(zipWriter)
  116. // 遍历目录中的所有文件和子目录
  117. err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  118. if err != nil {
  119. return err
  120. }
  121. // 将文件或目录添加到 zip 文件中
  122. if !info.IsDir() {
  123. var (
  124. file *os.File
  125. f io.Writer
  126. )
  127. file, err = os.Open(path)
  128. if err != nil {
  129. return err
  130. }
  131. defer func(file *os.File) {
  132. err = file.Close()
  133. if err != nil {
  134. logrus.Warning("压缩文件创建发生异常, 异常为: ", err)
  135. }
  136. }(file)
  137. // 创建 zip 文件中的文件
  138. zipPath := strings.TrimPrefix(strings.ReplaceAll(path, "\\", "/"), dir+"/")
  139. if zipPath == "" {
  140. return nil
  141. }
  142. zipPath = filepath.ToSlash(zipPath)
  143. f, err = zipWriter.Create(zipPath)
  144. if err != nil {
  145. return err
  146. }
  147. // 将文件内容复制到 zip 文件中
  148. _, err = io.Copy(f, file)
  149. if err != nil {
  150. return err
  151. }
  152. }
  153. return nil
  154. })
  155. if err != nil {
  156. logrus.Warning("压缩文件创建发生异常, 异常为: ", err)
  157. }
  158. }
  159. // 返回数据
  160. func resultError(code int, err error) []byte {
  161. return resultAll("操作失败!", code, nil, err)
  162. }
  163. func resultSuccess(data any) []byte {
  164. return resultAll("操作成功!", 1, data, nil)
  165. }
  166. func resultAll(msg string, code int, data any, err error) []byte {
  167. result := make(map[string]any)
  168. result["code"] = code
  169. result["msg"] = msg
  170. if data != nil {
  171. result["data"] = data
  172. }
  173. if err != nil {
  174. result["err"] = err.Error()
  175. }
  176. marshal, err := json.Marshal(result)
  177. if err != nil {
  178. fmt.Println("json转换错误!")
  179. }
  180. return marshal
  181. }