Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lade ich Dateien mit POST-Anfragen in Golang in Telegram hoch?

Wie lade ich Dateien mit POST-Anfragen in Golang in Telegram hoch?

DDD
DDDOriginal
2024-11-04 07:49:30180Durchsuche

How to Upload Files to Telegram with POST Requests in Golang?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn