package utils import ( "fmt" "math/rand" "os" "path" "strconv" "strings" "time" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" ) const ( BYTE = 1 << (10 * iota) KILOBYTE MEGABYTE GIGABYTE TERABYTE PETABYTE EXABYTE ) // Determine whether the given path is a folder func IsDir(path string) bool { s, err := os.Stat(path) if err != nil { return false } return s.IsDir() } // Determine whether the given path is a file func IsFile(path string) bool { return !IsDir(path) } // Create a directory func MkDir(path string) error { return os.MkdirAll(path, os.ModePerm) } func GetNewFileNameAndContentType(fileName string, fileType int) (string, string) { suffix := path.Ext(fileName) newName := fmt.Sprintf("%d-%d%s", time.Now().UnixNano(), rand.Int(), fileName) contentType := "" if fileType == constant.ImageType { contentType = "image/" + suffix[1:] } return newName, contentType } func ByteSize(bytes uint64) string { unit := "" value := float64(bytes) switch { case bytes >= EXABYTE: unit = "E" value = value / EXABYTE case bytes >= PETABYTE: unit = "P" value = value / PETABYTE case bytes >= TERABYTE: unit = "T" value = value / TERABYTE case bytes >= GIGABYTE: unit = "G" value = value / GIGABYTE case bytes >= MEGABYTE: unit = "M" value = value / MEGABYTE case bytes >= KILOBYTE: unit = "K" value = value / KILOBYTE case bytes >= BYTE: unit = "B" case bytes == 0: return "0" } result := strconv.FormatFloat(value, 'f', 1, 64) result = strings.TrimSuffix(result, ".0") return result + unit }