ホームページ > バックエンド開発 > Golang > Go でマルチパート/フォームデータの POST リクエストでファイルのアップロードを適切に処理する方法は?

Go でマルチパート/フォームデータの POST リクエストでファイルのアップロードを適切に処理する方法は?

Linda Hamilton
リリース: 2024-12-01 07:32:11
オリジナル
310 人が閲覧しました

How to Properly Handle File Uploads in Multipart/Form-Data POST Requests with Go?

Go でのマルチパート/フォームデータ POST のトラブルシューティング

Go の mime/multipart および http パッケージを使用してマルチパート フォームを送信するコンテキストでは、特定の問題が発生する可能性があります。トラブルシューティングが必要です。ファイル フィールドの作成に関連する具体的なケースを詳しく見てみましょう。

問題

次のコードがあり、テキスト フィールドとファイルの両方を含むマルチパート フォームを送信しようとしています:

func main() {
    // ...

    // Create a file field
    fw, err := w.CreateFormFile("file", "filename.dat")
    if err != nil {
        return err
    }

    // ...

    // Send the request
    resp, err := http.Post(url, w.FormDataContentType(), &buffer)
    if err != nil {
        return err
    }

    // ...
}
ログイン後にコピー

しかし、ファイルフィールドライターにファイルを読み取るための Reader を取得する方法に苦労しています。 fw.

解決策

この問題を解決するには、os.Open を使用してファイルを開き、返された *os.File を io.Writer として CreateFormFile 関数に渡す必要があります。修正されたコードは次のとおりです:

import (
    "bytes"
    "io"
    "mime/multipart"
    "net/http"
    "os"
)

func main() {
    // ...

    // Open the file
    fd, err := os.Open("filename.dat")
    if err != nil {
        return err
    }

    // Create a file field
    fw, err := w.CreateFormFile("file", "filename.dat")
    if err != nil {
        return err
    }

    // Copy the file contents into the file field writer
    _, err = io.Copy(fw, fd)
    if err != nil {
        return err
    }

    // ...

    // Send the request
    resp, err := http.Post(url, w.FormDataContentType(), &buffer)
    if err != nil {
        return err
    }

    // ...
}
ログイン後にコピー

この変更により、ファイルの内容がマルチパート フォームに正しく書き込まれ、テキスト フィールドとファイルの両方を正常に送信できるようになります。

以上がGo でマルチパート/フォームデータの POST リクエストでファイルのアップロードを適切に処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート