为什么在form里面含有enctype="multipart/form-data"时用r.parseForm()就解析不到数据

liujianche11 · · 7560 次点击
gihnius
http://gihnius.net/
这个要用 MultipartReader, 如果非数据,用 r.FormValue 的话就不需要 parseForm()了。
#1
更多评论
我也是刚刚接触GO,希望下面的回答能够给你带来帮助: 这个net/http包里面关于ParseFrom部分的一段源码: func (r *Request) ParseForm() error { var err error if r.PostForm == nil { if r.Method == "POST" || r.Method == "PUT" { r.PostForm, err = parsePostForm(r) } if r.PostForm == nil { r.PostForm = make(url.Values) } } if r.Form == nil { if len(r.PostForm) > 0 { r.Form = make(url.Values) copyValues(r.Form, r.PostForm) } var newValues url.Values if r.URL != nil { var e error newValues, e = url.ParseQuery(r.URL.RawQuery) if err == nil { err = e } } if newValues == nil { newValues = make(url.Values) } if r.Form == nil { r.Form = newValues } else { copyValues(r.Form, newValues) } } return err } 上面那段代码分析来看主要是用在POST与PUT方法的值的获取。而且还是通过url链来查询url中所传递过来的值。而对于你所上传的文件并不是通过URL连来传输数据到server端。所以肯定是不能够解析到;这种方法的最大数据包大小为:10MB 而你所设置的multipart/form-data是二进制文件流的传输。所以你所获取的方法肯定也不能是值的获取的形式。 net/http包中,提供了multipartReader()方法来获取二进制流文件: func (r *Request) MultipartReader() (*multipart.Reader, error) { if r.MultipartForm == multipartByReader { return nil, errors.New("http: MultipartReader called twice") } if r.MultipartForm != nil { return nil, errors.New("http: multipart handled by ParseMultipartForm") } r.MultipartForm = multipartByReader return r.multipartReader() } 上面的代码中调用r.MultipartForm来解析上传文件表单。
#2