为什么在form里面含有enctype="multipart/form-data"时用r.parseForm()就解析不到数据
我也是刚刚接触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