En essayant d'écrire une fonction permettant de télécharger un fichier sur Telegram via une requête POST, vous avez rencontré l'erreur « Mauvaise demande : il n'y a pas de photo dans la demande. » Votre approche initiale utilisant la fonction SendPostRequest s'est avérée infructueuse.
Après une recherche approfondie, la solution améliorée suivante a été trouvée :
<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) ) // Iterate over the files and add them as form fields 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 } } // Close the multipart writer err := w.Close() if err != nil { return []byte{}, err } // Create a new POST request req, err := http.NewRequest("POST", url, buf) if err != nil { return []byte{}, err } // Set the Content-Type header req.Header.Add("Content-Type", w.FormDataContentType()) // Create a new HTTP client client := &http.Client{} // Send the request res, err := client.Do(req) if err != nil { return []byte{}, err } // Close the response body defer res.Body.Close() // Read the response body cnt, err := io.ReadAll(res.Body) if err != nil { return []byte{}, err } return cnt, nil }</code>
Cette solution mise à jour utilise un formulaire en plusieurs parties. données pour envoyer le fichier, ce qui résout le problème et garantit que le fichier est présent dans la demande.
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!