前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Golang 获取GET、POST参数及处理上传多个文件

Golang 获取GET、POST参数及处理上传多个文件

原创
作者头像
IT工作者
发布于 2022-06-30 11:17:27
发布于 2022-06-30 11:17:27
2.2K00
代码可运行
举报
文章被收录于专栏:程序技术知识程序技术知识
运行总次数:0
代码可运行

http.request的三个属性Form、PostForm、MultipartForm:

Form:存储了post、put和get参数,在使用之前需要调用ParseForm方法。

PostForm:存储了post、put参数,在使用之前需要调用ParseForm方法。

MultipartForm:存储了包含了文件上传的表单的post参数,在使用前需要调用ParseMultipartForm方法。

获取Get参数

实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
   "fmt"
   "log"
   "net/http"
)

func sayHelloHandler(w http.ResponseWriter, r *http.Request) {
   r.ParseForm()//解析url传递的参数,对于POST则解析响应包的主体(request body)
         //注意:如果没有调用ParseForm方法,下面无法获取表单的数据
   uid := r.Form["uid"]
   fmt.Println(uid)
}

func main() {
   http.HandleFunc("/", sayHelloHandler) //   设置访问路由
   log.Fatal(http.ListenAndServe(":8080", nil))
}

用postman测试,提交http://localhost:8080/?uid=111

服务端输出 :[111]

提交: http://localhost:8080/?uid=111&uid=222

服务端输出:[111 222]

小结:r.Form是url.Values字典类型,r.Form[“id”]取到的是一个数组类型。因为http.request在解析参数的时候会将同名的参数都放进同一个数组里。

因为r.Form包含了GET、POST参数,POST参数优先,那么想只获取GET参数怎么办?可以改进代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    query := r.URL.Query()
    uid := query["uid"][0]
    fmt.Println(uid)

以上代码意思是获取Url问号后地代码。

获取POST参数

这里有两种情况:

普通的post表单请求,Content-Type=application/x-www-form-urlencoded

有文件上传的表单,Content-Type=multipart/form-data

第一种情况,只获取文本类型参数用以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uid := r.PostFormValue("uid")
fmt.Println(uid)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
r.ParseForm()
uid := r.PostForm["uid"]
fmt.Println(uid)

r.PostFormValue()和r.PostForm区别是r.PostFormValue()只获取第一个参数,r.PostForm获取的是一个数组。

第二种情况,获取文本类型参数用以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
r.ParseMultipartForm(32 << 20)
if r.MultipartForm != nil {
   values := r.MultipartForm.Value["uid"]
   fmt.Println(values)
}

处理上传单个文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
   "log"
   "net/http"
   "os"
   "io"
)

func sayHelloHandler(w http.ResponseWriter, r *http.Request) {

   // 根据字段名获取表单文件
   formFile, header, err := r.FormFile("uploadfile")
   if err != nil {
      log.Printf("Get form file failed: %s\n", err)
      return
   }
   defer formFile.Close()
   // 创建保存文件
   destFile, err := os.Create("./upload/" + header.Filename)
   if err != nil {
      log.Printf("Create failed: %s\n", err)
      return
   }
   defer destFile.Close()
   
   // 读取表单文件,写入保存文件
   _, err = io.Copy(destFile, formFile)
   if err != nil {
      log.Printf("Write file failed: %s\n", err)
      return
   }


   //fmt.Fprintf(w, "Hello world!\n") //这个写入到w的是输出到客户端的
}

func main() {
   http.HandleFunc("/", sayHelloHandler) //   设置访问路由
   log.Fatal(http.ListenAndServe(":8080", nil))
}

处理上传多个文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "os"
)

func sayHelloHandler(w http.ResponseWriter, r *http.Request) {
    //设置内存大小
    r.ParseMultipartForm(32 << 20)
    //获取上传的文件组
    files := r.MultipartForm.File["uploadfile"]
    len := len(files)
    for i := 0; i < len; i++ {
        //打开上传文件
        file, err := files[i].Open()
        defer file.Close()
        if err != nil {
            log.Fatal(err)
        }
        //创建上传目录
        os.Mkdir("./upload", os.ModePerm)
        //创建上传文件
        cur, err := os.Create("./upload/" + files[i].Filename)

        defer cur.Close()
        if err != nil {
            log.Fatal(err)
        }
        io.Copy(cur, file)
        fmt.Println(files[i].Filename) //输出上传的文件名
    }

    //fmt.Fprintf(w, "Hello world!\n") //这个写入到w的是输出到客户端的
}

func main() {
    http.HandleFunc("/", sayHelloHandler) //    设置访问路由
    log.Fatal(http.ListenAndServe(":8080", nil))
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
55. 上传文件(Web版) | 厚土Go学习笔记
实现一个简单的页面上传文件功能。 单机测试,上传1G以上的MP4电影也没问题。如果是internet环境,你测试一下告我好了。呵呵! /** * MyFileUpload01 * @Author: Jian Junbo * @Email: junbojian@qq.com * @Create: 2017/9/17 15:14 * Copyright (c) 2017 Jian Junbo All rights reserved. * * Description: 简单的上传文件 */ packag
李海彬
2018/03/19
6090
golang学习之文件上传
首先是上传页面upload.html: <!doctype html> <html> <head> <meta charset="utf-8"> <title>Upload</title> </hea
用户1141560
2017/12/26
1K0
go实现websocket功能
package main import ( "fmt" "golang.org/x/net/websocket" //go get golang.org/x/net/websocket 下载websocket包 "html/template" //支持模板html "log" "net/http" ) func Echo(ws *websocket.Conn) { var err error for { var reply string //websocket接受信息 if err = websocket.Message.Receive(ws, &reply); err != nil { fmt.Println("can't receive") break } fmt.Println("reveived back from client: " + reply) msg := "received:" + reply fmt.Println("send to client:" + msg) //这里是发送消息 if err = websocket.Message.Send(ws, msg); err != nil { fmt.Println("can't send") break } } } func web(w http.ResponseWriter, r *http.Request) { //打印请求的方法 fmt.Println("method", r.Method) if r.Method == "GET" { //如果请求方法为get显示login.html,并相应给前端 t, _ := template.ParseFiles("websocket.html") t.Execute(w, nil) } else { //否则走打印输出post接受的参数username和password fmt.Println(r.PostFormValue("username")) fmt.Println(r.PostFormValue("password")) } } func main() { //接受websocket的路由地址 http.Handle("/websocket", websocket.Handler(Echo)) //打开html页面 http.HandleFunc("/web", web) if err := http.ListenAndServe(":1234", nil); err != nil { log.Fatal("ListenAndServe:", err) } } -------------------------------------------------- <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>go测试socket</title> </head> <body> <script type="text/javascript"> var sock = null; var wsuri = "ws://127.0.0.1:1234/websocket"; window.onload = function() { console.log("onload"); sock = new WebSocket(wsuri); sock.onopen = function() { console.log("connected to " + wsuri); } sock.onclose = function(e) { console.log("connection closed (" + e.code + ")");
公众号-利志分享
2022/04/25
7150
go实现表单提交
package main import ( "fmt" "html/template" //支持模板html "log" //打印日志log类 "net/http" "strings" ) func sayHelloName(w http.ResponseWriter, r *http.Request) { r.ParseForm() fmt.Println(r.Form) fmt.Println("path", r.URL.Path) fmt.Println("scheme", r.URL.Scheme) fmt.Println(r.Form["url_long"]) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("val:", strings.Join(v, "")) } fmt.Fprintf(w, "hello box") } func login(w http.ResponseWriter, r *http.Request) { //打印请求的方法 fmt.Println("method", r.Method) if r.Method == "GET" { //如果请求方法为get显示login.html,并相应给前端 t, _ := template.ParseFiles("login.html") t.Execute(w, nil) } else { //否则走打印输出post接受的参数username和password fmt.Println(r.PostFormValue("username")) fmt.Println(r.PostFormValue("password")) } } func main() { //监听 / 走sayHelloName http.HandleFunc("/", sayHelloName) //路由控制/login 走login方法 http.HandleFunc("/login", login) err := http.ListenAndServe(":8081", nil) if err != nil { log.Fatal("ListenAndServe:", err) } } -------------------------------------------------- <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>go 登录test</title> </head> <body> <form method="POST" action="/login"> <input type="text" name="username" /> <input type="text" name="password" /> <input type="submit" value="登录"> </form> </body> </html>
公众号-利志分享
2022/04/25
1.1K0
Go 语言 Web 编程系列(十四)—— 获取用户请求数据(下)
默认情况下,POST 表单编码类型属性 enctype 值是 application/x-www-form-urlencoded,其含义是将表单请求数据编码为 URL 参数,该属性用于指定提交表单时生成请求的请求头 Content-Type 的值。
学院君
2020/05/27
9600
golang学习笔记之四 - web服务器与表单处理
我们看到上面的代码,要编写一个Web服务器很简单,只要调用http包的两个函数就可以了;如果你以前是PHP程序员,那你也许就会问,我们的nginx、apache服务器不需要吗?Go就是不需要这些,因为他直接就监听tcp端口了,做了nginx做的事情,然后sayhelloName这个其实就是我们写的逻辑函数了,跟php里面的控制层(controller)函数类似
躺平程序员老修
2023/09/05
2000
Go语言之搭建服务端接收前端文件上传
HTML表单(form)enctype(Encode Type)属性控制表单在提交数据到服务器时数据的编码类型.
IT工作者
2022/03/29
2.2K0
Go语言的基础表单处理
我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容。在这个看似简单的用户行为背后,到底隐藏了些什么呢? 对于普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。
一只特立独行的兔先生
2020/04/01
5K0
Go语言的基础表单处理
Golang 下载文件
这里使用net/http下载文件,可以设置Content-Type(具体参考)告诉客户端返回的内容类型实际上是什么,实现不同方式的文件的下载。
孤烟
2020/09/27
1.7K0
GO-处理请求
Go 语言的 net/http 包提供了一系列用于表示 HTTP 报文的结构,我们可以使用它处理请求和发送相应,其中 Request 结构代表了客户端发送的请求报文,下面让我们看一下 Request 结构体
cwl_java
2020/04/08
7000
Go HTTP
在网络编程里多数情况下,我们都在处理HTTP请求,关于请求协议的部分我推荐阅读《TCP协议》这本书,绝对值得购买。Go语言也提供了一个标准库包net/http,让开发者可以快速的处理HTTP请求,其封装的易用性,足够简单。并且,整个net包里提供了多种多样的处理模块,比如rpc等等。http包提供了HTTP客户端和服务端的实现,这让我想到了Node.js提供的http模块。
icepy
2019/06/24
1.5K0
Go HTTP
厚土Go学习笔记 | 34. 一个简单的 web 服务器实现
go 语言实现 web 服务器很容易。这样就可以很任意的建立 web 应用而互不干扰。当然,端口和IP要规划好。不过这里不讨论这个范畴的内容。我们只实现最基本的通过浏览器能够打印出我们想要的文字就可以了。 我们需要实现 http.Handler 。 func sayhello_cofox(w http.ResponseWriter, r *http.Request) 然后用 http.HandleFunc 设置访问的路由 使用 http.ListenAndServe 设置主域名和端口号 err := ht
李海彬
2018/03/19
7400
Go语言(十二)web编程
web编程 web编程基础 web的工作方式 http协议介绍 http请求体 http响应体 Web程序开发 基于“net/http”封装的web服务相关的功能 使用简单 func sayhel
alexhuiwang
2020/09/24
1.1K0
Go语言(十二)web编程
Go学习之 - 一个简单的web服务
最近项目中用到Go来写websocket,然后顺便看看Go web。 package main import ( . "fmt" "net/http" "log" ) func sayHelloName(w http.ResponseWriter, r *http.Request) { r.ParseForm() Println(r) Println("Methods:",r.Method) if r.Method == "POST" {
简单、
2018/07/17
3100
go 构建一个Web服务
Go Web 服务”指的是使用 Go 编程语言创建的网络服务。具体来说,它是一个基于 Go 语言的程序,通过使用 net/http 包来处理 HTTP 请求和响应,从而实现了一个简单的 Web 服务。
贵哥的编程之路
2024/03/22
1080
go 构建一个Web服务
Go 语言 Web 编程系列(十三)—— 获取用户请求数据(上)
在 PHP 中,可以直接通过全局变量 $_GET 和 $_POST 快速获取 GET/POST 请求数据,GET 请求数据主要是 URL 查询字符串中包含的参数,以前面在线论坛项目的群组详情页为例:
学院君
2020/05/27
2.1K0
Go 上传一个10M的文件, 真的会用10M的内存吗?
seth-shi
2023/12/18
3070
go client http post upload上传及 server 参数获取
首先需要知道client是如何通过 http 协议 实现信息和参数的传递,以及server是怎么接受参数.
solate
2019/07/22
5.5K0
Go HTTP 编程 | 03 - 表单的输入与验证
表单是 Web 应用中非常中重要的组成部分,通过表单可以方法的让客户端和服务器进行数据的交互。Go 中对于 form 的处理非常方便,在 Request 中有专门的 form 处理方法。
RiemannHypothesis
2022/11/25
1.4K0
Go HTTP 编程 | 03 - 表单的输入与验证
Golang学习-第二篇 搭建一个简单的Go Web服务器
正文 Go语言标准库 - net/http 在学习Go语言有一个很好的起点,Go语言官方文档很详细,今天我们学习的Go Web服务器的搭建就需要用到Go语言官方提供的标准库 net/http,通过http包提供了HTTP客户端和服务端的实现。同时使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置和操作。如果对http概念不是太清楚的朋友可以自行google。 http包建立Web服务器 package main import ( "fmt" "net/http"
李海彬
2018/03/27
2.4K0
Golang学习-第二篇 搭建一个简单的Go Web服务器
相关推荐
55. 上传文件(Web版) | 厚土Go学习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档