package lib import ( "SciencesServer/utils" "errors" "fmt" "mime/multipart" "path/filepath" "strings" "time" ) type ( UploadConfig struct { Path string // 根目录,完整目录-更目录+时间 Ext []string // 文件类型 Size int64 // 文件大小 Rename bool // 重命名 } UploadHandle struct { Url string `json:"url"` Filepath string `json:"filepath"` Filename string `json:"filename"` RelativePath string `json:"-"` } ) type ( Handle func(file *multipart.FileHeader, domain string) (*UploadHandle, error) ) func (this *UploadConfig) ext(ext string) bool { if !utils.InArray(strings.ToLower(ext), this.Ext) { return false } return true } func (this *UploadConfig) size(size int64) bool { if size > this.Size { return false } return true } func (this *UploadConfig) Handle() Handle { return func(file *multipart.FileHeader, domain string) (handle *UploadHandle, e error) { ext := filepath.Ext(file.Filename) if !this.ext(strings.Replace(ext, ".", "", 1)) { return nil, errors.New("文件类型限制不可上传") } if this.Size > 0 && !this.size(file.Size) { return nil, errors.New("文件过大不可上传") } // 判断目录是否存在 now := time.Now() this.Path += now.Format("20060102") + "/" isExist, err := utils.PathExists(this.Path) if err != nil { return nil, err } if !isExist { if err = utils.MkdirAll(this.Path); err != nil { return nil, err } } _file := file.Filename if this.Rename { file.Filename = utils.Md5String(file.Filename, fmt.Sprintf("%d", now.UnixNano())) _file = file.Filename + ext } _filepath := "/" + this.Path + _file return &UploadHandle{ Url: domain + _filepath, Filepath: _filepath, Filename: _file, RelativePath: this.Path + _file, }, nil } } func Upload(path string, ext []string, size int64, rename bool) *UploadConfig { return &UploadConfig{ Path: path, Ext: ext, Size: size, Rename: rename, } }