【问题标题】:Input TYPE TEXT Value form (enctype=“multipart/form-data”) returns null输入 TYPE TEXT 值形式(enctype=“multipart/form-data”)返回 null
【发布时间】:2016-05-07 16:01:17
【问题描述】:
func fupload(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        r.ParseForm()
        company := r.FormValue("company")
        fmt.Println(company)
        _, header, _ := r.FormFile("upfile")
        fmt.Println(header.Filename)
        return
    }
    w.Write([]byte("<html><body>"))
    w.Write([]byte(fmt.Sprintf("<form method=\"POST\" enctype=\"multipart/form-data\">")))
    w.Write([]byte("Enter Company <input type=\"text\" maxlength=\"80\" size=\"80\" name=\"company\" ><br/>"))
    w.Write([]byte("File to upload: <input type=\"file\" name=\"upfile\" /><br/>"))
    w.Write([]byte("<input type=\"submit\"  value=\"Submit\"/>"))
    w.Write([]byte("</form>"))
    w.Write([]byte("</body></html>"))
    return
}

对于输入类型Text(例如)Company这里总是返回NULL,当enctype="multipart/form-data"时

【问题讨论】:

    标签: http go


    【解决方案1】:

    ParseForm 只解析查询参数。来自文档:

    ParseForm 从 URL 解析原始查询并更新 r.Form。

    对于 POST 或 PUT 请求,它还将请求正文解析为表单 并将结果放入 r.PostForm 和 r.Form 中。 POST 和 PUT 正文 参数优先于 r.Form 中的 URL 查询字符串值。

    如果请求正文的大小尚未受到限制 MaxBytesReader,大小上限为 10MB。

    ParseMultipartForm 自动调用 ParseForm。它是幂等的。

    如果你想处理“multipart/form-data”,要么使用ParseMultipartForm,要么不调用任何一个,让FormValue调用需要的东西。

    【讨论】:

      【解决方案2】:

      是的,您应该使用 enctype="multipart/form-data"。但是如果你已经使用了 FormValue(key string) 或 FormFile(key string) 方法,你不应该使用 ParseForm() 方法。

      Request.FormFile

      FormFile 返回提供的表单键的第一个文件。表格文件 必要时调用 ParseMultipartForm 和 ParseForm。

      Request.FormValue

      FormValue 返回命名组件的第一个值 询问。 POST 和 PUT 正文参数优先于 URL 查询 字符串值。 FormValue 调用 ParseMultipartForm 和 ParseForm 如果 必要并忽略这些函数返回的任何错误。如果键 不存在,FormValue 返回空字符串。访问多个 相同键的值,调用 ParseForm 然后检查 Request.Form 直接。

      <form action="/fupload" method="POST" enctype="multipart/form-data">
         <input type="file" name="fileupload">
      </form>
      
      
      file, _, err := req.FormFile("fileupload")
          switch err {
          case nil:
              defer file.Close()
              fileData, err := ioutil.ReadAll(file)
              //check err
          case http.ErrMissingFile:
              //do something
          default:
              //do something
          }
      

      【讨论】:

        猜你喜欢
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2022-06-25
        相关资源
        最近更新 更多