猿问

使用 Go Gin 读取请求正文中的文件

当我尝试使用 Go Gin 读取我的 HTTP 请求的请求正文时,我得到的是空文件。根据我的请求,我发送了一个附加到请求正文的文件(内容类型:application/octet-stream)。


Request Headers

Authorization: Bearer XXX

User-Agent: PostmanRuntime/7.29.0

Accept: */*

Postman-Token: XXX

Host: localhost:8080

Accept-Encoding: gzip, deflate, br

Connection: keep-alive

Content-Length: 12

Content-Type: application/octet-stream

Request Body

src: "Path to my file"

后端代码:


bodySize, _ = strconv.ParseInt(c.Request.Header.Get("Content-Length"), 10, 64)

buf := bytes.NewBuffer(make([]byte, 0, bodySize))

_, err = io.Copy(buf, c.Request.Body)

fmt.Println(buf.String())

打印语句打印空字符串但文件不为空(内容长度为 12)。


陪伴而非守候
浏览 244回答 1
1回答

POPMUISE

@novalagung 是的,我在 main 函数之前的中间件中读取它,在中间件之后继续执行 c.Next() 。在中间件中,读取工作正常。–阅读内容后将http.Request.Body是空的。您需要在读取后将请求主体存储在某个地方,因此您不需要读取它两次。req.Body或者,还有另一种替代解决方法,您可以在阅读后将内容放回。// middleware do read the bodybodyBytes, _ := ioutil.ReadAll(req.Body)req.Body.Close()  //  must close// put back the bodyBytes to req.Bodyreq.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))但我不推荐它!
随时随地看视频慕课网APP

相关分类

Go
我要回答