我正在尝试在 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 logicfunc 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)}
1 回答
肥皂起泡泡
TA贡献1829条经验 获得超6个赞
它在句柄函数中。我在调用上传函数之前读取了所有的流数据。这是处理程序的修改代码,现在一切正常:
func uploadLogoHandler(w http.ResponseWriter, r *http.Request) {
writeToLog("uploadLogoHandler:" + r.URL.Path, "")
upload(w, r)
}
如果我理解正确,那么错误:“multipart:NextPart:EOF”意味着表单是空的 - 它是空的,因为我之前清空了缓冲流。
希望它能帮助别人。
- 1 回答
- 0 关注
- 298 浏览
添加回答
举报
0/150
提交
取消