Golang获取multipart form-data

12

假设我有一个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>

以下是Go代码:

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"))
    }
}

我如何获取"delete"的值?

part.Header.Get("delete"))

它没有起作用


要从多部分数据中读取文件,请使用request.FormFile,它返回文件的引用、文件头和错误 - http://golang.org/pkg/net/http/#Request.FormFile - Santosh Suresh
3个回答

17

这部分实现了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())
   } 
}

15
你可以使用 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"))
}

4
这种方法会将文件内容读入内存,而multipartReader用于将内容流式传输到磁盘或另一个终端点。我仍在寻找OP问题的答案。 - gregtzar
我不明白你在问什么。问题是如何访问字段的值,特别是使用MultipartReader似乎不是关键点。 - Elwinar
3
这个问题是关于如何使用MultipartReader访问字段值的,而不是ParseMultipartForm。如果我们不想将整个请求读入内存和/或临时文件中(这就是FormValue在调用ParseMultipartForm时所做的),那么这是必要的。使用MultipartReader进行此操作的答案是,在循环遍历部分时,以part.FormName()为键。 - gregtzar
好的,看来问题提出者对我的回答还算满意,所以我想你在断言他的意图方面是错误的。现在,你提出的(基于part.FormName)让我感到很困惑。如果你真的想使用multipart.Part读取常规字段,我的猜测是你将不得不将Part作为io.Reader使用... - Elwinar
2
我目前正在我的应用程序中的multipart.Reader循环中打开part.FormName部分,并且它运行良好。虽然每个multipart.Part都实现了io.Reader接口,但这对于帮助您确定部分表示哪个表单数据参数没有任何帮助。 OP可能只是在寻找一种继续项目的方法,并且并不真正关心解决方案的内存和/或安全性影响。我根本没有断言他们的意图,而是回答了他们所问的字面问题,这恰好也是我想知道的。 - gregtzar
显示剩余2条评论

0
以下是使用Golang处理multipart/form-data并从HTTP请求创建文件的示例。 此外,点击这里了解如何进行单元测试 :)
func UploadFile(w http.ResponseWriter, r *http.Request) {
 if err := r.ParseMultipartForm(4); err != nil {
  w.WriteHeader(http.StatusBadRequest)
  return
 }

 // create a temporary directory
 dir, err := os.MkdirTemp("", "tmp")
 if err != nil {
  w.WriteHeader(http.StatusInternalServerError)
  return
 }

 // create a temporary file
 f, err := os.CreateTemp(dir, "")
 if err != nil {
  _ = os.RemoveAll(dir)
  w.WriteHeader(http.StatusInternalServerError)
  return
 }
 defer closeFile(f)
 defer os.RemoveAll(dir)

 code := doSomething(f)
 if code != http.StatusOK {
  w.WriteHeader(code)
  return
 }

 w.WriteHeader(http.StatusCreated)
 w.Write([]byte("Done :)"))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接