2016-10-08 5 views
1

マルチパートフォームファイルを読む必要があります。カスタムのreq objをhttp.requestオブジェクトではなくハンドラ関数に渡しています.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'オブジェクトをあなたのカスタムリクエストに埋め込む/ includeする必要があると思うので、' 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 
     } 
    } 
} 
関連する問題