units.go 3.8 KB

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