Maison >développement back-end >Golang >Comment corriger l'erreur « Mauvaise demande : il n'y a pas de photo dans la demande » lors du téléchargement de fichiers avec les requêtes POST de Go ?

Comment corriger l'erreur « Mauvaise demande : il n'y a pas de photo dans la demande » lors du téléchargement de fichiers avec les requêtes POST de Go ?

DDD
DDDoriginal
2024-11-03 04:13:30269parcourir

How to Fix

Téléchargement de fichiers avec des requêtes POST dans Go

Dans Go, vous pouvez utiliser une requête HTTP POST pour télécharger des fichiers sur un serveur distant. Lorsque vous utilisez l'API du bot de Telegram, vous pouvez rencontrer un message d'erreur indiquant « Mauvaise demande : il n'y a pas de photo dans la demande. » Cela indique que les données du fichier ne sont pas incluses correctement dans la requête.

Pour résoudre ce problème, vous devez formater la requête POST en tant que requête multipart/form-data. Cela vous permet d'inclure à la fois des paramètres de texte et des données de fichier binaire dans la même requête. Voici une version mise à jour de votre code qui inclut les modifications requises :

<code class="go">import (
    "bytes"
    "io"
    "mime/multipart"
    "net/http"
    "path/filepath"
)

// content is a struct which contains a file's name, its type and its data.
type content struct {
    fname string
    ftype string
    fdata []byte
}

func sendPostRequest(url string, files ...content) ([]byte, error) {
    var (
        buf = new(bytes.Buffer)
        w   = multipart.NewWriter(buf)
    )

    for _, f := range files {
        part, err := w.CreateFormFile(f.ftype, filepath.Base(f.fname))
        if err != nil {
            return []byte{}, err
        }

        _, err = part.Write(f.fdata)
        if err != nil {
            return []byte{}, err
        }
    }

    err := w.Close()
    if err != nil {
        return []byte{}, err
    }

    req, err := http.NewRequest("POST", url, buf)
    if err != nil {
        return []byte{}, err
    }
    req.Header.Add("Content-Type", w.FormDataContentType())

    client := &http.Client{}
    res, err := client.Do(req)
    if err != nil {
        return []byte{}, err
    }
    defer res.Body.Close()

    cnt, err := io.ReadAll(res.Body)
    if err != nil {
        return []byte{}, err
    }
    return cnt, nil
}</code>

Ce code mis à jour :

  • Crée un multipart.Writer pour construire la requête multipart/form-data.
  • Ajoute chaque fichier à la requête à l'aide de CreateFormFile.
  • Ferme l'éditeur multipart pour terminer la construction de la requête.
  • Définit l'en-tête du type de contenu sur multipart/form-data.
  • Envoie la demande et récupère la réponse de Telegram.

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