Go Http开发Form表单处理


原文链接: Go Http开发Form表单处理

提问?

  1. 对于一个form表单中有多个文件类型上传的在golang中如何处理?






multipart: NextPart: http: invalid Read on closed Body

解决方案 : 修改Header的大小

s := &http.Server{

    Addr:           ":12345",
    ReadTimeout:    10 * time.Second,
    WriteTimeout:   10 * time.Second,
    MaxHeaderBytes: 1 << 20,
}

s.ListenAndServe() // listen and serve on 0.0.0.0:8080

  1. 对w接口的写入必须写在FormFile 之后

    	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // 这里不能对w接口进行写入
    		if http.MethodPost == r.Method {
    			f, _, err := r.FormFile("file")
    			if err != nil {
    				fmt.Println(err)
    				return
    			}
    			defer f.Close()
    		}
        w.Write([]byte(html_header)) //对w接口的写入必须写在FormFile 之后
    	})
    

    文件上传

    方式1:上传执行脚本:
    一般网页上传文件大家都会用到这个标签

    我们可以通过这个标签选取文件,使用js进行文件上传等操作,同时,该标签同时可以选取多个文件

    但有些时候,进行其他操作的时候,用户需要获得文件夹路径,那么这种写法可以用该标签选取文件夹




    HTML表单的输入控件主要有以下几种:
    文本框,对应的,用于输入文本;
    口令框,对应的,用于输入口令;
    单选框,对应的,用于选择一项;
    复选框,对应的,用于选择多项;
    下拉框,对应的,用户不可见,但表单提交时会把隐藏文本发送到服务器。

    HTML表单中,可以上传文件的唯一控件就是
    注意:当一个表单包含时,表单的enctypemultipart/form-data,method必须指定为post,浏览器才能正确编码并以multipart/form-data格式发送表单的数据。

    出于安全考虑,浏览器只允许用户点击来选择本地文件,用JavaScript对的value赋值是没有任何效果的。当用户选择了上传某个文件后,JavaScript也无法获得该文件的真实路径:

    输出 checkbox

    {{ $ic := .ItemCategories }}  //this is needed since range changes the context
    {{range .Categories}}
    <input name="cat" type="checkbox" value="{{ .Id }}" {{ CategorySelected .Id $ic}}/> {{ .Title}} <br />
    {{end}}
    
<input type="checkbox" name="checkbox" id="checkbox_id" value="value">
<label for="checkbox_id" id="checkbox_lbl">Text</label>
	<script>
	$("#checkbox_lbl").click(function(){ 
    if($("#checkbox_id").is(':checked'))
        $("#checkbox_id").removAttr('checked');
    else
       $("#checkbox_id").attr('checked');
    });</script>

Form表单处理多个checkbox

    <form method="post" name="myform" action="http://localhost:8081/post" >
     <input type="checkbox" name="product_image_id" value="Apple" />
     <input type="checkbox" name="product_image_id" value="Orange" />
     <input type="checkbox" name="product_image_id" value="Grape" />
     <input type="submit">
    </form>

// ProcessCheckboxes will process checkboxes
func ProcessCheckboxes(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
	productsSelected := r.Form["product_image_id"]
	
    fmt.Printf("%+v\n", r.Form)
    log.Println(contains(productsSelected, "Grape"))
}

func contains(slice []string, item string) bool {
    set := make(map[string]struct{}, len(slice))
    for _, s := range slice {
        set[s] = struct{}{}
    }
    _, ok := set[item]
    return ok
}

Output

Orange and Grape checboxes are checked and submitted

map[product_image_id:[Orange Grape]]
2016/10/27 16:16:06 true

Apple and Orange checboxes are checked and submitted

map[product_image_id:[Apple Orange]]


<input type="checkbox" name="product_image_id" value="0" />
<input type="checkbox" name="product_image_id" value="1" checked/>
<input type="checkbox" name="product_image_id" value="2" checked/>
<input type="checkbox" name="product_image_id" value="3" />
<input type="checkbox" name="product_image_id" value="4" checked/>

r.Form["product_image_id"][0] == "1"
r.Form["product_image_id"][1] == "2"
r.Form["product_image_id"][2] == "4"
`