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 ""
相關文章
相關標籤/搜索