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

liujianche11 · 2013-11-08 07:28:17 · 7748 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-11-08 07:28:17 的主题,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

7748 次点击  
加入收藏 微博
2 回复  |  直到 2013-11-17 13:43:10
gihnius
gihnius · #1 · 11年之前

这个要用 MultipartReader, 如果非数据,用 r.FormValue 的话就不需要 parseForm()了。

ty4z2008
ty4z2008 · #2 · 11年之前

我也是刚刚接触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来解析上传文件表单。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传