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

时间:2018-12-30 20:30:37

标签: html http go file-upload

我正在尝试在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)
}

///////////////////////////////////////////////////////////////////////////////////////
// main

func main() {
    if(len(os.Args) < 2) {
        fmt.Println("Usage: receiver [port number]")
        os.Exit(1)
    }

    port := os.Args[1]

    s := &http.Server{
        Addr:           ":" + port,
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
    }   
    http.HandleFunc("/uploadLogo/", uploadLogoHandler)
    http.HandleFunc("/", handler)
    log.Fatal(s.ListenAndServe())
}

1 个答案:

答案 0 :(得分:0)

在撰写问题时,我已经发现了问题。它在句柄功能中。在调用上载函数之前,我读取了所有流数据。这是处理程序的修改后的代码,现在一切正常:

func uploadLogoHandler(w http.ResponseWriter, r *http.Request) {
    writeToLog("uploadLogoHandler:" + r.URL.Path, "")
    upload(w, r)
}

如果我正确理解,则错误:“ multipart:NextPart:EOF”表示该表单为空-并且为空,因为我之前清空了缓冲流。

希望它将对他人有所帮助。 最好。