// 单个文件 上传文件到本地目录里 // 调用方法 utils.UplaodFileToLocal(c) // author haima func UplaodFileToLocal(c *gin.Context) (err error,path string){ // 单个文件 file, err := c.FormFile("file") if err != nil { err = errors.New(fmt.Sprintf("获取数据失败,%v", err)) return } //获取文件后缀 extstring := Ext(file.Filename) if extstring == ""{ err = errors.New("上传失败,文件类型不支持,只能上传 xlsx 格式的。") return } extStrSlice := []string{".xlsx"} if !ContainArray(extstring, extStrSlice) { //fmt.Println("上传失败,文件类型不支持,只能上传 xlsx 格式的。") err = errors.New("上传失败,文件类型不支持,只能上传 xlsx 格式的。") return } //filepath := 'resource/public/uploads/' filepath := global.GVA_CONFIG.Uploads.FilePath //从配置文件里取 //若是没有filepath文件目录就建立一个 if _, err := os.Stat(filepath); err != nil { if !os.IsExist(err) { os.MkdirAll(filepath, os.ModePerm) } } //上传到的路径 //path := 'resource/public/uploads/20060102150405test.xlsx' file.Filename = fmt.Sprintf("%s%s", time.Now().Format("20060102150405"), file.Filename) // 文件名格式 本身能够改 建议保证惟一性 path = filepath + file.Filename //路径+文件名上传 // 上传文件到指定的目录 err = c.SaveUploadedFile(file, path) if err != nil { err = errors.New(fmt.Sprintf("上传失败,%v", err)) return } return } //Contain 判断obj是否在target中,target支持的类型array,slice,map false:不在 true:在 func ContainArray(obj interface{}, target interface{}) bool { targetValue := reflect.ValueOf(target) switch reflect.TypeOf(target).Kind() { case reflect.Slice, reflect.Array: for i := 0; i < targetValue.Len(); i++ { if targetValue.Index(i).Interface() == obj { return true } } case reflect.Map: if targetValue.MapIndex(reflect.ValueOf(obj)).IsValid() { return true } } return false } //获取文件的扩展名 func Ext(path string) string { for i := len(path) - 1; i >= 0 && path[i] != '/'; i-- { if path[i] == '.' { return path[i:] } } return ""