kra/pkg/upload/upload.go

72 lines
1.6 KiB
Go

package upload
import (
"errors"
"mime/multipart"
"path"
"strings"
"time"
"github.com/google/uuid"
)
var (
ErrFileEmpty = errors.New("文件为空")
ErrFileTooLarge = errors.New("文件过大")
ErrFileTypeError = errors.New("文件类型不允许")
)
// OSS 对象存储接口
type OSS interface {
UploadFile(file *multipart.FileHeader) (string, string, error)
DeleteFile(key string) error
}
// Config 上传配置
type Config struct {
Type string // local, aliyun, tencent, qiniu, minio, aws-s3, huawei-obs, cloudflare-r2
Path string
MaxSize int64
}
// GenerateFileName 生成文件名
func GenerateFileName(originalName string) string {
ext := path.Ext(originalName)
name := uuid.New().String()
return name + ext
}
// GeneratePath 生成存储路径
func GeneratePath(basePath string) string {
now := time.Now()
return path.Join(basePath, now.Format("2006/01/02"))
}
// CheckFileSize 检查文件大小
func CheckFileSize(size int64, maxSize int64) error {
if size > maxSize {
return ErrFileTooLarge
}
return nil
}
// CheckFileType 检查文件类型
func CheckFileType(filename string, allowTypes []string) error {
ext := strings.ToLower(path.Ext(filename))
for _, t := range allowTypes {
if ext == t || t == "*" {
return nil
}
}
return ErrFileTypeError
}
// DefaultAllowTypes 默认允许的文件类型
var DefaultAllowTypes = []string{
".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp",
".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx",
".txt", ".md", ".json", ".xml", ".csv",
".zip", ".rar", ".7z", ".tar", ".gz",
".mp3", ".mp4", ".avi", ".mov", ".wmv",
}