本文介绍go语言中的表单处理,以及表单中的文件上传
文章目录
1. 获取表单字段信息
我们先来看一段html
<form role="form" id="form1" method="post" class="form-horizontal" enctype="multipart/form-data" action="/save">
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" > 姓名</label>
<div class="col-sm-10">
<input name="name" type="text" placeholder="姓名" value="{{.Name}}">
<span class="red">*</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" >性别</label>
<div class="col-sm-10">
<input name="gender" type="radio" value="1" {{if eq .Gender 1}}checked{{end}} /> 男
<input name="gender" type="radio" value="2" {{if eq .Gender 2}}checked{{end}} /> 女
<span class="red">*</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" > 爱好</label>
<div class="col-sm-10">
<input name="hobby" type="checkbox" value="1" {{if (FindInt .Hobby 1) }}checked{{end}} /> 足球
<input name="hobby" type="checkbox" value="2" {{if (FindInt .Hobby 2) }}checked{{end}} /> 篮球
<input name="hobby" type="checkbox" value="3" {{if (FindInt .Hobby 3) }}checked{{end}} /> 羽毛球
<span class="red">*</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" > 是否工作:</label>
<div class="col-sm-10">
<select name="isWork" id="">
<option value="">未知</option>
<option value="1" {{if eq .IsWork 3}}selected{{end}}>是</option>
<option value="2" {{if eq .IsWork 3}}selected{{end}}>否</option>
</select>
<span class="red">*</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" > 头像</label>
<div class="col-sm-10">
<input type="file" name="avoter" id="">
<span class="red">*</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" > </label>
<div class="col-sm-10">
<button class="btn btn-info btn-sm" type="submit"><i class="ace-icon fa fa-check bigger-110"></i>提交
</button>
<button class="btn btn-default btn-sm" type="reset"><i class="ace-icon fa fa-repeat bigger-110"></i>重置
</button>
</div>
</div>
</form>
填写信息如图所示:
然后我们使用 注意,所有表单处理之前都需要调用
ParseForm
func save(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil {
log.Printf("%v",err)
}
log.Printf("%+v",r.Form) // map[hobby:[2 3] isWork:[2] avoter:[sfview.png] name:[张三] gender:[1]]
log.Printf("%+v",r.FormValue("name")) //张三
log.Printf("%v",r.FormValue("hobby")) //2
log.Printf("%v",r.PostFormValue("hobby")) //2
for _,v := range r.Form["hobby"] {
log.Printf("%s",v) //2 3
}
w.Write([]byte("成功"))
}
函数 | 说明 |
---|---|
ParseForm() |
在获取字段之前必须 调用 |
Form |
一个map 对象存储所有的字段信息 |
FormValue(key string) |
获取单个字段值 |
PostFormValue(key string) |
获取单个POST 字段值 |
需要注意的是,字段如果是多个值如
checkbox
则不能使用FormValue
或PostFormValue
函数获取,他们仅仅返回的是该字段容器中的第一个值,而不是所有值,如果要获取所有值 请使用Form
属性
2. 文件上传
form中的文件上传比较简单,使用
FormFile
函数就能获得文件指针
file, _, err := r.FormFile("avoter") //input file中的name名字
if err != nil {
http.Error(w, err.Error(), 500)
return
}
defer file.Close()
path := "E:/goproject/src/gostudy/temp/"
f,err := os.Create(path+"a.png")
defer f.Close()
io.Copy(f,file)
需要注意的是,
form
标签中一定要携带enctype="multipart/form-data"
属性,否则这里文件读取会报错