Wie können Sie mit Go sowohl eine Datei als auch JSON-Daten aus einer HTTP-Anforderung analysieren?

Doherty Codes:

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)
}
Sofa:

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.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Senden Sie sowohl Parameter als auch Body-Daten mit einer JMeter-HTTP-Anforderung

Wie füge ich sowohl eine Datei als auch ein JSON-Formular in einer FastAPI-POST-Anforderung hinzu?

Wie verwende ich sowohl HTTPS als auch HTTP, um JSON-Daten in Android zu analysieren?

Wie können sowohl eine Basisklasse als auch Mixins mit einer vue-class-Komponente verwendet werden?

Wie wählt man Daten in Scrapy aus einer HTML-Datei aus, die sowohl Klasse als auch ID hat?

Können wir eine App mit sowohl einer .odex-Datei außerhalb der APK als auch einer Klassen.dex-Datei innerhalb der APK haben?

So erstellen Sie einen Spark-SQL-Datenrahmen aus einer JSON-Datei, in der sowohl Daten als auch Schema aufgeführt sind

Wie können Sie mit PySpark einen String json aus einer vorhandenen temporären Tabelle analysieren?

Mit Pandas können Sie sowohl eine Zeile als auch den gesamten Datenrahmen damit übergeben

Wie können Sie Werte aus einer txt-Datei in eine Liste von Datensätzen in OCaml analysieren?

Wie kopiere ich sowohl stdout als auch stderr aus einem Bash-Skript in eine Datei mit Zeitstempel?

Wie kann ich eine Datei mit Schnittstellennamen in bestimmten Teilen erstellen und später aus einer anderen Datei analysieren, um die Schnittstelle mit Daten in GO zu ändern?

Wie können Sie eine Baumanzeige mit dynamischen Daten aus einer API in React erstellen?

Extrahieren Sie nur Text in Hindi aus einer Datei, die sowohl Hindi als auch Englisch enthält

Wie leite ich sowohl stdout als auch stderr aus einem Bash-Skript in eine Datei um?

So können Sie in ASP.net MVC mit einer Schaltfläche sowohl "aktivieren" als auch "deaktivieren"

Wie können Sie in Python überprüfen, ob eine Zeichenfolge sowohl Groß- als auch Kleinbuchstaben enthält?

Mit der JavaScript-Abruf-API können Sie in einem ".then" -Rückruf sowohl auf Header als auch auf JSON zugreifen?

Wie kann ich mit Spring Data JPA sowohl Links als auch Werte aus einer Spalte abrufen?

Analysieren Sie mit Lua mehrere Arrays in json aus einer Datei

Wie können wir sagen, dass "int i" sowohl eine Definition als auch eine Deklaration ist?

Wie erstelle ich mit Stripe in einer einzigen Aktion sowohl einen Kunden als auch eine Karte?

Wie rufen Sie eine Methode sowohl "innerhalb" als auch "außerhalb" einer Instanz in Python auf?

So finden Sie eine beliebige Zahl sowohl ganzzahlig als auch dezimal in einer Zeichenfolge mit Regex (Python)

Können in Go sowohl ein Typ als auch ein Zeiger auf einen Typ eine Schnittstelle implementieren?

Wie lösen Sie eine Ausnahme innerhalb eines Ausnahmeblocks ohne Ausnahmeverkettung auf eine Weise aus, die sowohl mit Python 2 als auch mit Python 3 kompatibel ist?

Wie können wir solr sowohl mit MongoDB als auch mit MySQL verwenden?

Wie werden sowohl einfache als auch mit Anführungszeichen versehene JSON-Nummern in Go analysiert?

Wie löse ich eine Schaltfläche zum Hinzufügen sowohl mit einem Klick als auch mit einer Eingabetaste auf der Tastatur aus?