Heim >Backend-Entwicklung >Golang >Wie behebt man den Fehler „Fehlerhafte Anfrage: Die Anfrage enthält kein Foto' beim Hochladen von Dateien mit POST-Anfragen von Go?

Wie behebt man den Fehler „Fehlerhafte Anfrage: Die Anfrage enthält kein Foto' beim Hochladen von Dateien mit POST-Anfragen von Go?

DDD
DDDOriginal
2024-11-03 04:13:30269Durchsuche

How to Fix

Dateien mit POST-Anfragen in Go hochladen

In Go können Sie eine HTTP-POST-Anfrage verwenden, um Dateien auf einen Remote-Server hochzuladen. Wenn Sie die Bot-API von Telegram verwenden, wird möglicherweise die Fehlermeldung „Ungültige Anfrage: Die Anfrage enthält kein Foto“ angezeigt. Dies weist darauf hin, dass die Dateidaten nicht korrekt in die Anfrage einbezogen werden.

Um dieses Problem zu beheben, müssen Sie die POST-Anfrage als mehrteilige/Formulardaten-Anfrage formatieren. Dadurch können Sie sowohl Textparameter als auch Binärdateidaten in dieselbe Anfrage einbeziehen. Hier ist eine aktualisierte Version Ihres Codes, die die erforderlichen Änderungen enthält:

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

Dieser aktualisierte Code:

  • Erstellt einen multipart.Writer, um die Multipart-/Formulardatenanforderung zu erstellen.
  • Fügt jede Datei mithilfe von CreateFormFile zur Anfrage hinzu.
  • Schließt den Multipart-Writer, um die Anfragekonstruktion abzuschließen.
  • Setzt den Inhaltstyp-Header auf Multipart/Formulardaten.
  • Sendet die Anfrage und ruft die Antwort von Telegram ab.

Das obige ist der detaillierte Inhalt vonWie behebt man den Fehler „Fehlerhafte Anfrage: Die Anfrage enthält kein Foto' beim Hochladen von Dateien mit POST-Anfragen von Go?. 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