Maison > développement back-end > Golang > le corps du texte

Comment corriger l'erreur « Mauvaise demande : il n'y a pas de photo dans la demande » lors du téléchargement de fichiers vers des robots Telegram dans Go ?

Susan Sarandon
Libérer: 2024-11-03 18:58:02
original
909 Les gens l'ont consulté

How to Fix

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

Dans Go, vous pouvez télécharger des fichiers vers des robots Telegram à l'aide du package http. Cependant, vous avez rencontré une erreur : « Requête incorrecte : il n'y a pas de photo dans la demande. » Cela indique que les données du fichier ne sont pas incluses correctement dans votre demande.

Pour résoudre ce problème, le code suivant peut être utilisé :

<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>
Copier après la connexion

Ce code utilise le package multipart pour créer un requête multipart/form-data contenant les données du fichier. La structure de contenu représente un fichier avec son nom, son type et ses données. La fonction sendPostRequest prend une URL et un nombre variable d'objets de contenu, construit la requête en plusieurs parties, l'envoie et renvoie la réponse.

Dans votre cas, vous pouvez utiliser ce code pour télécharger un fichier sur un bot Telegram API :

<code class="go">func SendPostRequest(url string, filename string) []byte {
    file, err := os.Open(filename)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    stat, err := file.Stat()
    if err != nil {
        log.Fatal(err)
    }

    fileData, err := ioutil.ReadAll(file)
    if err != nil {
        log.Fatal(err)
    }

    return sendPostRequest(url,
        content{filename, "photo/jpeg", fileData},
    )
}</code>
Copier après la connexion

Ce code ouvre le fichier, lit son contenu dans une tranche d'octets et utilise sendPostRequest pour envoyer le fichier au API.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!