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>
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>
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!