输入TYPE TEXT值表单(enctype =“multipart / form-data”)返回null

时间:2016-01-29 19:37:21

标签: http go

func fupload(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        r.ParseForm()
        company := r.FormValue("company")
        fmt.Println(company)
        _, header, _ := r.FormFile("upfile")
        fmt.Println(header.Filename)
        return
    }
    w.Write([]byte("<html><body>"))
    w.Write([]byte(fmt.Sprintf("<form method=\"POST\" enctype=\"multipart/form-data\">")))
    w.Write([]byte("Enter Company <input type=\"text\" maxlength=\"80\" size=\"80\" name=\"company\" ><br/>"))
    w.Write([]byte("File to upload: <input type=\"file\" name=\"upfile\" /><br/>"))
    w.Write([]byte("<input type=\"submit\"  value=\"Submit\"/>"))
    w.Write([]byte("</form>"))
    w.Write([]byte("</body></html>"))
    return
}

对于输入类型Text(例如)当enctype =&#34; multipart / form-data&#34;

时,公司总是返回NULL

2 个答案:

答案 0 :(得分:2)

ParseForm仅解析查询参数。来自文档:

  

ParseForm从URL解析原始查询并更新r.Form。

     

对于POST或PUT请求,它还会将请求正文解析为表单   并将结果放入r.PostForm和r.Form中。 POST和PUT身体   参数优先于r.Form中的URL查询字符串值。

     

如果请求Body的大小尚未受到限制   MaxBytesReader,大小上限为10MB。

     

ParseMultipartForm自动调用ParseForm。它是幂等的。

如果您想要处理&#34; multipart / form-data&#34;或者不要拨打电话,请ParseMultipartForm使用{{3}},让FormValue拨打所需的电话。

答案 1 :(得分:0)

是的,您应该使用enctype =&#34; multipart / form-data&#34;。但是,如果已经使用FormValue(键字符串)或FormFile(键字符串)方法,则不应使用ParseForm()方法。

Request.FormFile

  

FormFile返回提供的表单键的第一个文件。 FormFile   如有必要,调用ParseMultipartForm和ParseForm。

Request.FormValue

  

FormValue返回指定组件的第一个值   查询。 POST和PUT正文参数优先于URL查询   字符串值。 FormValue调用ParseMultipartForm和ParseForm if   必需并忽略这些函数返回的任何错误。如果关键   不存在,FormValue返回空字符串。访问多个   相同键的值,调用ParseForm然后检查Request.Form   直接

<form action="/fupload" method="POST" enctype="multipart/form-data">
   <input type="file" name="fileupload">
</form>


file, _, err := req.FormFile("fileupload")
    switch err {
    case nil:
        defer file.Close()
        fileData, err := ioutil.ReadAll(file)
        //check err
    case http.ErrMissingFile:
        //do something
    default:
        //do something
    }