在您的示例中,您尝试读取r.Body,就好像它被剥离了请求的PDF部分一样,但事实并非如此。您需要分别处理PDF和JSON这两个部分。为此使用http。(*
Request).MultipartReader()。
r.MultipartReader()将返回mime /
multipart.Reader对象,因此您可以使用r.NextPart()函数遍历各个部分并分别处理每个部分。
因此,您的处理程序函数应如下所示:
func (s *Server) PostFileHandler(w http.ResponseWriter, r *http.Request) { mr, err := r.MultipartReader() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } doc := Doc{} for { part, err := mr.NextPart() // This is OK, no more parts if err == io.EOF { break } // Some error if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // PDF 'file' part if part.FormName() == "file" { doc.Url = part.FileName() fmt.Println("URL:", part.FileName()) outfile, err := os.Create("./docs/" + part.FileName()) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer outfile.Close() _, err = io.Copy(outfile, part) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } // JSON 'doc' part if part.FormName() == "doc" { jsonDeprer := json.NewDeprer(part) err = jsonDeprer.Depre(&doc) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } fmt.Println(doc.Title, doc.Url, doc.Cat, doc.Date) } } doc.Id = len(docs) + 1 err = s.db.Insert(&doc) checkErr(err, "Insert failed") s.Ren.JSON(w, http.StatusOK, &doc)}


