gpt4 book ai didi

http - 如何在 Golang net/http 请求中将常规 FormValue 与多部分表单数据结合起来

转载 作者:IT王子 更新时间:2023-10-29 01:58:25 26 4
gpt4 key购买 nike

我想在为要求。我不想在执行此操作时使请求无效。

它工作正常,除非传入的请求有一个 multipart form-data,在我调用 FormValue 之后数据变得无效并且有最终路由中没有任何内容需要解析。

最佳答案

我写了一个实用函数来解决我的问题:

package utils

import (
"bytes"
"io"
"io/ioutil"
"mime"
"mime/multipart"
"net/http"
"strings"
)

// Get form values without invalidating the request body in case the data is multiform
func GetFormValues(request *http.Request, keys []string) []string {
var values []string
mediaType, params, err := mime.ParseMediaType(request.Header.Get("Content-Type"))
if err != nil || !strings.HasPrefix(mediaType, "multipart/") {
for i := range keys {
values = append(values, request.FormValue(keys[i]))
}
} else { // multi form
buf, _ := ioutil.ReadAll(request.Body)
origBody := ioutil.NopCloser(bytes.NewBuffer(buf))
var rdr = multipart.NewReader(bytes.NewBuffer(buf), params["boundary"])
for len(values) < len(keys) {
part, err_part := rdr.NextPart()
if err_part == io.EOF {
break
}
for i := range keys {
if part.FormName() == keys[i] {
buf := new(bytes.Buffer)
buf.ReadFrom(part)
values = append(values, buf.String())
}
}
}
request.Body = origBody
}
if len(values) == len(keys) {
return values
} else {
return nil
}
}

// Get form value without invalidating the request body in case the data is multiform
func GetFormValue(request *http.Request, key string) string {
if result := GetFormValues(request, []string{key}); len(result) == 1 {
return result[0]
} else {
return ""
}
}

现在不用调用

value := request.FormValue(key)

我愿意

value := utils.GetFormValue(request, key)

或多个值

values := utils.GetFormValues(request, []string{keys...})

关于http - 如何在 Golang net/http 请求中将常规 FormValue 与多部分表单数据结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40644415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com