Ich bin festgefahren, um herauszufinden, wie sowohl ein PDF-Dokument als auch JSON-Daten aus einem http-Anforderungsformular von einem Angularjs-Frontend analysiert werden können. Die Anforderungsnutzlast ist
HTTP-Anfrage
Inhaltsdisposition: Formulardaten; name = "file"; Dateiname = "Parent Handbook.pdf" Inhaltstyp: application / pdf
Inhaltsdisposition: Formulardaten; name = "doc"
{"title": "test", "cat": "test cat", "date": 20142323}
Die "Datei" ist das PDF und "doc" sind die JSON-Daten, die ich analysieren möchte.
Mein Handler kann die Datei problemlos analysieren und speichern, kann jedoch nichts aus dem Json herausholen. Irgendwelche Ideen?
func (s *Server) PostFileHandler(w http.ResponseWriter, r *http.Request) {
const _24K = (1 << 20) * 24
err := r.ParseMultipartForm(_24K)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
doc := Doc{}
jsonDecoder := json.NewDecoder(r.Body)
fmt.Println(r.Body)
err = jsonDecoder.Decode(&doc)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(doc.Title, doc.Url, doc.Cat, doc.Date)
doc.Id = len(docs) + 1
err = s.db.Insert(&doc)
checkErr(err, "Insert failed")
// files := m.File["myFile"]
for _, fheaders := range r.MultipartForm.File {
for _, hdr := range fheaders {
var infile multipart.File
infile, err = hdr.Open()
// defer infile.Close()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
doc.Url = hdr.Filename
fmt.Println(hdr.Filename)
var outfile *os.File
outfile, err = os.Create("./docs/" + hdr.Filename)
// defer outfile.Close()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
_, err = io.Copy(outfile, infile)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
}
s.Ren.JSON(w, http.StatusOK, &doc)
// http.Error(w, "hit file server", http.StatusOK)
}
In Ihrem Beispiel versuchen Sie, r.Body so zu lesen, als wäre es aus dem PDF-Teil der Anforderung entfernt worden, aber dies ist nicht der Fall. Sie müssen beide Teile, PDF und JSON, separat verarbeiten. Verwenden Sie dazu http. (* Request) .MultipartReader () .
r.MultipartReader () gibt Ihr mime / multipart.Reader- Objekt zurück, sodass Sie Teile mit der Funktion r.NextPart () durchlaufen und jedes Teil separat verarbeiten können.
Ihre Handlerfunktion sollte also folgendermaßen aussehen:
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" {
jsonDecoder := json.NewDecoder(part)
err = jsonDecoder.Decode(&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)
}
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen