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