2016-10-08 2 views
1

Мне нужно прочитать файл с несколькими файлами. Я передаю пользовательский req obj функции обработчика, а не объект http.request, я использую Gorilla Mux. Handler Подпись что-то вроде этого:
Загрузка многопользовательского файла: как обрабатывать 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'. Как указано в [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 
     } 
    } 
} 
Смежные вопросы