Go与HTML表单

本文介绍了Go语言中处理HTML表单的方法,包括POST和GET请求的区别,以及如何通过Form、PostForm和MultipartForm字段解析不同编码类型的表单数据。此外,还讲解了如何使用FormValue和PostFormValue快捷方法获取键值对,以及如何处理文件上传,特别是使用multipart/form-data编码上传文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POST和GET请求都可以传递表单,但一般由POST请求传递表单。以GET方法传递表单时,表单数据以键值的形式包含在请求的URL里。服务器在接收到浏览器发送的数据表单之后 ,还需要对这些数据进行语法分析,从而提取数据中的记录的键值对。
HTML表单的内容类型(content type)决定了POST请求在发送键值对将使用何种格式,HTML表单的内容类型是由表单的enctype属性指定的:

application/x-www-form-urlencoded  //用于简单文本传输,编码简单高效,计算量少
multipart/form-data  //传输大量数据(如上传文件),还可以通过Base64编码,传输二进制数据
text/plain

不接受application/json编码
Form字段:
支持url编码,键值的来源是url和表单。
PostForm字段:
支持url编码,键值的来源是表单。如果一个键同时拥有表单键值和url键值,用户只想获取表单键值,可使用该字段。

func process(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()  //语法分析
    fmt.Fprintln(w, "表单键值对和URL键值对:", r.Form)
    fmt.Fprintln(w, "表单键值对:", r.PostForm)
}

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>Form字段练习</title>
</head>
<body>
<form action="http://127.0.0.1:8080/process?name=go&color=red" method="post" enctype="application/x-www-form-urlencoded">
    <input type="text" name="name" value="mc"/>
    <input type="text" name="color" value="red"/>
    <input type="submit"/>
</form>
</body>
</html>

MultipartForm字段:
支持mutipart/form-data编码,键值来源是表单。

func dataProcess(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(1024)  //从表单里提取多少字节的数据
    fmt.Fprintln(w, r.MultipartForm)  //multipartform是包含2个映射的结构
}

快捷方法:
FormValue:自动调取ParseForm或ParseMultpartForm方法,获取键值对。
PostFormValue:类似FormValue,只支持获取表单键值。
上传文件:
multpart/form-data编码通常用于实现文件上传,需要file类型的input标签。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>upload</title>
</head>
<body>
<form action="http://localhost:8080/file" method="post" enctype="multipart/form-data">
    <input type="file" name="uploaded">
    <input type="submit">
</form>
</body>
</html>

上传:

func fprocess(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(4096)  
    fileHeader := r.MultipartForm.File["uploaded"][0]  //获取名为"uploaded"的第一个文件头

    file, err := fileHeader.Open()  //获取文件
    if err != nil {
        fmt.Println("error")
        return
    }

    data, err := ioutil.ReadAll(file)  //读取文件
    if err != nil {
        fmt.Println("error!")
        return
    }
    fmt.Fprintln(w, string(data))
}

快捷方法:
FormFile方法同时返回文件和文件头,包含了语法分析,只获取文件名的第一个文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值