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答案 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()方法。
FormFile返回提供的表单键的第一个文件。 FormFile 如有必要,调用ParseMultipartForm和ParseForm。
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
}