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 ""
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM