2016-10-08 3 views
1

다중 파트 양식 파일을 읽어야합니다. 나는 사용자 정의 req obj를 http.request 객체가 아닌 handler 함수에 전달하고 있는데, Gorilla Mux를 사용하고 있습니다.
다중 파일 업로드 : FileHeaders 처리 방법

func handlerFunc(w http.ResponseWriter, cR *custReqObj) 

내가 이런 식으로 접근하고 있습니다 :

내가 요청 객체를 해달라고 때문에
fileHeaders := cR.MultipartForm.File["file"] 
fileHeader := fileHeaders[0] 
fileName := fileHeader.Filename 
file, err := fileHeader.Open() 

, 내가이 작업을 수행 할 수 없습니다

request.FormFile["file"] 
을 처리기 서명이 같은 것입니다

나는 http.FormFile을 거쳤으며 첫 번째 파일 헤더도 리턴한다.

if r.MultipartForm != nil && r.MultipartForm.File != nil { 
     if fhs := r.MultipartForm.File[key]; len(fhs) > 0 { 
      f, err := fhs[0].Open() 
      return f, fhs[0], err 
     } 
} 

내 접근 방식은 정확하고 어떤 경우에는 여러 개의 파일 헤더를 고려해야합니다? 파일 헤더가 무엇인지, 그리고 멀티 파트 패키지가 golang에서 어떻게 작동하는지에 대해 알 수 있다면 정말 고맙겠습니다.

+0

'custReqObj'를 어떻게 정의합니까? 사용자 정의 요청에'Request' 개체를 포함하거나 포함시켜야한다고 생각하기 때문에'http.Request'에 정의 된 메서드를 사용할 수 있습니다. [the doc] (https://golang.org/pkg/net/http/#Request.FormFile)에 설명 된대로, Request.FormFile은 첫 번째 파일 만 반환합니다. 파일이 여러 개 있거나 섹션이 여러 개인 경우 ['Request.MultipartReader'] (https://golang.org/pkg/net/http/#Request.MultipartReader)를 사용하여 각 파트를 읽은 다음 Part.FileName '또는'Part.FormName'을 사용하여 해당 데이터에 액세스하십시오. – putu

답변

2

req.MultipartForm을 사용하기 전에 req.ParseMultipartForm(SOME_SIZE)으로 전화해야합니다. 예 :

err := req.ParseMultipartForm(SOME_SIZE) 
if err != nil { 
    // ... 
} 

formdata := req.MultipartForm 
for k, files := range formdata.File { 
    for i := range files { 
     file, err := files[i].Open() 
     defer file.Close() 
     if err != nil { 
      // ... 
     } 

     fp := filepath.Join(someDirWithProperAccess, files[i].Filename) 
     out, err := os.Create(fp) 
     defer out.Close() 
     if err != nil { 
      // ... 
     } 

     _, err = io.Copy(out, file) 

     if err != nil { 
      logrus.Error(err) 
      return 
     } 
    } 
}