Eine Datei mit einer POST-Anfrage in Go hochladen
Das Hochladen einer Datei per HTTP-POST-Anfrage kann eine komplexe Aufgabe sein, insbesondere wenn es um Dritte geht -Party-APIs wie Telegram. Um dieses Problem zu beheben, untersuchen wir eine in Golang geschriebene benutzerdefinierte Funktion, die Datei-Uploads effizient verarbeitet.
Problem:
Sie haben einen Fehler von Telegram festgestellt, der auf ein fehlendes Foto hinweist in der Anfrage, auch nachdem erfolglose Online-Lösungen befolgt wurden.
Code-Snippet:
Das bereitgestellte Code-Snippet versucht, eine Datei mithilfe der Funktion os.Open() hochzuladen. aber es schlägt aufgrund der spezifischen API-Anforderungen von Telegram fehl.
Lösung:
Um dieses Problem zu beheben, erstellen wir eine benutzerdefinierte sendPostRequest-Funktion, die eine Multipart-/Formularfunktion verwendet. Datenanforderung zur Verarbeitung von Datei-Uploads. Diese Methode wird von Webservern und APIs weitgehend unterstützt. Hier ist der aktualisierte Code:
<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>
Verstehen der Lösung:
Die sendPostRequest-Funktion akzeptiert eine URL und eine variable Anzahl von Inhaltsstrukturen, die jeweils eine zu erstellende Datei darstellen hochgeladen. Es erstellt eine mehrteilige HTTP-Anfrage, in der jede Datei mit ihren Metadaten (Name, Typ und Daten) enthalten ist. Dieses Format stellt die Kompatibilität mit der API von Telegram sicher.
Verwendung:
Sie können die sendPostRequest-Funktion mit Ihren Dateiinformationen aufrufen und die Antwort des Servers in der cnt-Variablen empfangen. Zum Beispiel:
<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>
Fazit:
Diese benutzerdefinierte sendPostRequest-Funktion löst das Problem des Hochladens von Dateien über POST-Anfragen in Golang und berücksichtigt insbesondere die Datei-Upload-Anforderungen von Telegram. Durch die Verwendung von Multipart-/Formulardaten wird die Kompatibilität sichergestellt und das Hochladen von Dateien auf Remote-Server erleichtert.
Das obige ist der detaillierte Inhalt vonWie lade ich Dateien mit POST-Anfragen in Golang in Telegram hoch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!