// 單個文件 上傳文件到本地目錄裏 // 調用方法 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 ""