go语言中常用的功能之十(文件上传和表单处理)

本文介绍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 则不能使用FormValuePostFormValue 函数获取,他们仅仅返回的是该字段容器中的第一个值,而不是所有值,如果要获取所有值 请使用 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" 属性,否则这里文件读取会报错

猜你喜欢

转载自blog.csdn.net/wujiangwei567/article/details/87881452