Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 96 additions & 3 deletions net/ghttp/ghttp_request_param_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
package ghttp

import (
"strings"

"github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/net/goai"
"github.com/gogf/gf/v2/os/gstructs"
Expand Down Expand Up @@ -113,10 +115,26 @@ func (r *Request) GetRequestMap(kvMap ...map[string]interface{}) map[string]inte
// File uploading.
if r.MultipartForm != nil {
for name := range r.MultipartForm.File {
if uploadFiles := r.GetUploadFiles(name); len(uploadFiles) == 1 {
m[name] = uploadFiles[0]
uploadFiles := r.GetUploadFiles(name)
// 处理嵌套字段名称,如 data[files][]
if strings.Contains(name, "[") && strings.Contains(name, "]") {
// 解析字段名并创建嵌套结构
keys := parseFormNameToKeys(name)
if len(keys) > 0 {
// 使用解析后的键创建嵌套结构
if len(uploadFiles) == 1 {
createNestedMapForFiles(m, keys, uploadFiles[0])
} else {
createNestedMapForFiles(m, keys, uploadFiles)
}
}
} else {
m[name] = uploadFiles
// 常规字段处理,保持原有逻辑
if len(uploadFiles) == 1 {
m[name] = uploadFiles[0]
} else {
m[name] = uploadFiles
}
}
}
}
Expand Down Expand Up @@ -266,3 +284,78 @@ func mergeTagValueWithFoundKey(data map[string]interface{}, overwritten bool, fi
}
}
}

// parseFormNameToKeys 解析表单字段名称,例如 "data[files][]" 会解析为 ["data", "files[]"]
func parseFormNameToKeys(name string) []string {
// 查找第一个[的位置
firstBracket := strings.Index(name, "[")
if firstBracket < 0 {
return []string{name}
}

// 提取基本名称
base := name[:firstBracket]
keys := []string{base}

// 提取所有括号中的内容
remaining := name[firstBracket:]
for len(remaining) > 0 {
// 找到一对括号
closeBracket := strings.Index(remaining, "]")
if closeBracket < 0 {
break
}

// 提取括号中的内容
key := remaining[1:closeBracket]

// 处理空括号情况 如 []
if len(key) > 0 {
keys = append(keys, key)
} else {
// 对于空括号,将其附加到上一个键
lastIndex := len(keys) - 1
if lastIndex >= 0 {
keys[lastIndex] = keys[lastIndex] + "[]"
}
}

// 继续处理剩余部分
if len(remaining) > closeBracket+1 {
remaining = remaining[closeBracket+1:]
} else {
remaining = ""
}
}

return keys
}

// createNestedMapForFiles 根据解析的键创建嵌套的map结构
func createNestedMapForFiles(m map[string]interface{}, keys []string, value interface{}) {
if len(keys) == 0 {
return
}

// 处理最后一个层级
if len(keys) == 1 {
m[keys[0]] = value
return
}

// 处理中间层级
key := keys[0]
if m[key] == nil {
m[key] = make(map[string]interface{})
}

// 如果当前值不是map,则创建一个新的map
subMap, ok := m[key].(map[string]interface{})
if !ok {
subMap = make(map[string]interface{})
m[key] = subMap
}

// 递归处理剩余键
createNestedMapForFiles(subMap, keys[1:], value)
}
Loading