尽管表单有效,但 ParseMultipartForm 总是失败

我正在尝试在 go http 服务器中处理上传的文件。但是调用ParseMultipartForm总是失败并出现奇怪的错误:“ multipart: NextPart: EOF ” 尽管表单是有效的。调试它,我可以看到我得到了完整的编码数据、大小和参数。然而它解析失败。


这是 html 表单:


<html>

<head>

     <title>Upload file</title>

</head>

<body>

<form enctype="multipart/form-data" action="http://localhost:8080/uploadLogo/" method="post">

    <input type="file" name="uploadfile" />

    <input type="hidden" name="token" value="{{.}}" />

    <input type="submit" value="upload" />

</form>

</body>

</html>

这是相关的上传功能:


// upload logic

func upload(w http.ResponseWriter, r *http.Request) {

    fmt.Println("method:", r.Method)

    if r.Method == "GET" {

        // crutime := time.Now().Unix()

        // h := md5.New()

        // io.WriteString(h, strconv.FormatInt(crutime, 10))

        // token := fmt.Sprintf("%x", h.Sum(nil))


        // t, _ := template.ParseFiles("upload.gtpl")

        // t.Execute(w, token)

    } else {

        err := r.ParseMultipartForm(5 * 1024 * 1024 * 1024)

        if err != nil {

            fmt.Println("Error ParseMultipartForm: ", err) // here it fails !!! with: "multipart: NextPart: EOF"

            return

        }


        file, handler, err := r.FormFile("uploadfile")

        if err != nil {

            fmt.Println("Error parsing file", err)

            return

        }

        defer file.Close()

        fmt.Fprintf(w, "%v", handler.Header)

        fmt.Println("filename:", handler.Filename)

        f, err := os.OpenFile(logosDir + handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)

        if err != nil {

            fmt.Println(err)

            return

        }

        defer f.Close()

        io.Copy(f, file)

   }

}

无法理解为什么会这样。


这是我启动服务器的方式:


func uploadLogoHandler(w http.ResponseWriter, r *http.Request) {

    //fmt.Fprintf(w, "viewLogoHandler, Path: %s!", r.URL.Path[1:])

    bodyBytes, _ := ioutil.ReadAll(r.Body)

    bodyString := string(bodyBytes)

    writeToLog("uploadLogoHandler:" + r.URL.Path, "bodyString length:" + strconv.Itoa(len(bodyString)))

    upload(w, r)

}



白衣染霜花
浏览 299回答 1
1回答

肥皂起泡泡

它在句柄函数中。我在调用上传函数之前读取了所有的流数据。这是处理程序的修改代码,现在一切正常:func uploadLogoHandler(w http.ResponseWriter, r *http.Request) {    writeToLog("uploadLogoHandler:" + r.URL.Path, "")    upload(w, r)}如果我理解正确,那么错误:“multipart:NextPart:EOF”意味着表单是空的 - 它是空的,因为我之前清空了缓冲流。希望它能帮助别人。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go