Maison  >  Article  >  développement back-end  >  Comment analyser à la fois un fichier PDF et des données JSON à partir d'une seule requête HTTP en Go ?

Comment analyser à la fois un fichier PDF et des données JSON à partir d'une seule requête HTTP en Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-24 15:06:02394parcourir

How to Parse Both a PDF File and JSON Data from a Single HTTP Request in Go?

Analyse simultanée d'un fichier PDF et de données JSON à partir d'une seule requête HTTP dans Go

Lors du traitement des requêtes HTTP contenant des données de formulaire en plusieurs parties, il peut être nécessaire d'analyser à la fois un fichier et des données JSON à partir de la même requête. Un exemple courant est un formulaire dans lequel les utilisateurs peuvent télécharger un document (PDF) et fournir des données supplémentaires (JSON) liées au fichier.

Pour y parvenir dans Go, la fonction r.ParseMultipartForm est insuffisante car elle analyse uniquement données en plusieurs parties. Pour gérer à la fois le fichier et les données JSON séparément, la fonction r.MultipartReader est requise.

Solution :

La fonction r.MultipartReader renvoie un objet multipart.Reader qui permet de parcourir chaque partie des données du formulaire en plusieurs parties à l'aide de la fonction r.NextPart. Cela nous permet de traiter chaque partie individuellement, en distinguant la partie fichier et la partie JSON.

Voici une version mise à jour de la fonction de gestionnaire :

<code class="go">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()

        if err == io.EOF {
            break
        }

        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        if part.FormName() == "file" {
            doc.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
            }
        }

        if part.FormName() == "doc" {
            jsonDecoder := json.NewDecoder(part)
            err = jsonDecoder.Decode(&doc)
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn