ホームページ  >  記事  >  バックエンド開発  >  Go で Telegram ボットにファイルをアップロードする際の「無効なリクエスト: リクエストに写真がありません」エラーを修正する方法

Go で Telegram ボットにファイルをアップロードする際の「無効なリクエスト: リクエストに写真がありません」エラーを修正する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-11-03 18:58:02966ブラウズ

How to Fix

Go for Telegram での POST リクエストによるファイルのアップロード

Go では、http パッケージを使用してファイルを Telegram ボットにアップロードできます。ただし、「不正なリクエスト: リクエストに写真がありません。」というエラーが発生しました。これは、ファイル データがリクエストに正しく含まれていないことを示しています。

この問題を解決するには、次のコードを使用できます。

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

このコードは、マルチパート パッケージを使用して、ファイルデータを含む multipart/form-data リクエスト。コンテンツ構造体は、名前、タイプ、データを含むファイルを表します。 sendPostRequest 関数は、URL と可変数のコンテンツ オブジェクトを受け取り、マルチパート リクエストを構築して送信し、応答を返します。

あなたの場合、このコードを使用してファイルを Telegram ボットにアップロードできます。 API:

<code class="go">func SendPostRequest(url string, filename string) []byte {
    file, err := os.Open(filename)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    stat, err := file.Stat()
    if err != nil {
        log.Fatal(err)
    }

    fileData, err := ioutil.ReadAll(file)
    if err != nil {
        log.Fatal(err)
    }

    return sendPostRequest(url,
        content{filename, "photo/jpeg", fileData},
    )
}</code>

このコードはファイルを開き、その内容をバイト スライスに読み取り、sendPostRequest を使用してファイルを API に送信します。

以上がGo で Telegram ボットにファイルをアップロードする際の「無効なリクエスト: リクエストに写真がありません」エラーを修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。