Golang GET多部分表单数据

Mar*_*dan 5 html get multipartform-data go

假设我有一个HTML表单

<form enctype="multipart/form-data" action="http://localhost:8080/incarcat" method="post">
    <input type="file" name="file" multiple="multiple"/>
    <input type="checkbox" name="delete" value="delete">
    <input type="submit" value="Load" />
</form>
Run Code Online (Sandbox Code Playgroud)

以及转码

read_form, err := req.MultipartReader()
for {
    part, err_part := read_form.NextPart()
    if err_part == io.EOF {
        break
    }
    if part.FormName() == "file" {
        //do something with files
    } else if part.FormName() == "delete" {
        //curata_folder()
        log.Println("delete is: ", part.Header.Get("delete"))
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何获得"删除"的价值?

part.Header.Get("delete"))
Run Code Online (Sandbox Code Playgroud)

它不起作用

gre*_*zap 10

该部分实现了io.Reader接口.我假设您真正要问的是如何将零件阅读器转换为字符串,如果它不是文件.你可以这样做:

for {
   part, err_part := read_form.NextPart()
   if err_part == io.EOF {
      break
   }
   if part.FormName() == "delete" {
      buf := new(bytes.Buffer)
      buf.ReadFrom(part)
      log.Println("delete is: ", buf.String())
   } 
}
Run Code Online (Sandbox Code Playgroud)


Elw*_*nar 7

您可以通过使用该request.ParseMultipartForm方法满足自己,然后request.FormValue像往常一样使用获取值.请注意,您还request.MultipartForm可以访问您的文件.

例:

func(w http.ResponseWriter, r *http.Request) {
    // Here the parameter is the size of the form data that should
    // be loaded in memory, the remaining being put in temporary
    // files
    r.ParseMultipartForm(0)

    fmt.Println(r.FormValue("delete"))
}
Run Code Online (Sandbox Code Playgroud)

  • 此方法将文件内容读入内存,其中 mutlipartReader 用于将内容流式传输到磁盘或另一个端点。我仍在寻找 OP 问题的答案。 (4认同)
  • 问题是关于如何使用 MultipartReader 而不是 ParseMultipartForm 访问字段的值。如果我们不想将整个请求读入内存和/或临时文件,这是必要的,这就是 FormValue 在调用 ParseMultipartForm 时所做的。如何使用 MultipartReader 执行此操作的答案是在循环部件时关闭 part.FormName()。 (2认同)
  • 我目前正在我自己的应用程序中为 multipart.Reader 的循环内打开 part.FormName 并且它工作正常。虽然每个 multipart.Part 确实实现了 io.Reader 接口,但它不会帮助您确定部件代表哪个表单数据参数。OP 可能只是在寻找一种方法来继续他们的项目,并不真正关心解决方案的内存和/或安全影响。我根本没有断言他们的意图,而是解决他们提出的字面问题,这恰好也是我想知道的。 (2认同)