Télécharger un fichier avec une requête POST dans Go
Télécharger un fichier via une requête HTTP POST peut être une tâche complexe, en particulier lorsqu'il s'agit de tiers des API de fête comme Telegram. Pour résoudre ce problème, explorons une fonction personnalisée écrite en Golang qui gère efficacement les téléchargements de fichiers.
Problème :
Vous avez rencontré une erreur de Telegram indiquant une photo manquante. dans la demande, même après avoir suivi des solutions en ligne infructueuses.
Extrait de code :
L'extrait de code fourni tente de télécharger un fichier à l'aide de la fonction os.Open(), mais il échoue en raison des exigences spécifiques de l'API de Telegram.
Solution :
Pour résoudre ce problème, nous allons créer une fonction sendPostRequest personnalisée qui utilise un multipart/form- demande de données pour gérer les téléchargements de fichiers. Cette méthode est largement prise en charge par les serveurs Web et les API. Voici le code mis à jour :
<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>
Comprendre la solution :
La fonction sendPostRequest accepte une URL et un nombre variable de structures de contenu, chacune représentant un fichier à téléchargé. Il construit une requête HTTP en plusieurs parties, dans laquelle chaque fichier est inclus avec ses métadonnées (nom, type et données). Ce format garantit la compatibilité avec l'API de Telegram.
Utilisation :
Vous pouvez appeler la fonction sendPostRequest avec les informations de votre fichier et recevoir la réponse du serveur dans la variable cnt. Par exemple :
<code class="go">resp, err := sendPostRequest("https://your-url.com", content{fname: "photo.jpg", ftype: "image/jpeg", fdata: []byte{your_file_data}}) if err != nil { // Handle error }</code>
Conclusion :
Cette fonction sendPostRequest personnalisée résout le problème du téléchargement de fichiers via des requêtes POST dans Golang, en répondant spécifiquement aux exigences de téléchargement de fichiers de Telegram. En utilisant multipart/form-data, il garantit la compatibilité et facilite le téléchargement de fichiers sur des serveurs distants.
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!