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