gin 单个文件函数 上传文件到本地目录里

// 单个文件 上传文件到本地目录里
// 调用方法 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 ""
}
posted @ 2020-06-17 15:57  HaimaBlog  阅读(1173)  评论(0编辑  收藏  举报