「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go でファイル アップロード サービスを構築する

Go でファイル アップロード サービスを構築する

2024 年 11 月 7 日に公開
ブラウズ:692

Building a File Upload Service in Go

ファイルのアップロードについて話しましょう。次の Instagram、CMS、またはユーザー生成コンテンツを含むアプリを構築する場合は、ファイルを処理する必要があります。今日は、Go を使用した ファイル アップロードの世界に飛び込みます。ファイルをローカルに保存できるシンプルなファイル アップロード サービスをセットアップします。さらに、少し趣向を凝らして、Amazon S3 に接続して、完全なクラウド モードに移行できるようにします。 ?️

ゲームプランは次のとおりです:

  1. 簡単なファイル アップロード エンドポイントを設定しています。
  2. ファイルを処理し、ローカルに保存し、すべてが機能することを確認します。
  3. 安全を確保するために基本的な検証を追加します。
  4. そして、S3 ストレージでワンランク上の機能を実現します。

コーヒーを飲んで、さあ、出かけましょう! ☕


ステップ 1: ファイル アップロード エンドポイントの構築

まず最初に、/upload エンドポイントを使用して基本的な HTTP サーバーをセットアップしましょう。このため、私たちは Go の組み込み net/http パッケージにこだわっています。これは、単純で使いやすいためです。

サーバーのセットアップ

お気に入りのエディタを開き、main.go ファイルを作成し、基本的なサーバーをセットアップします:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/upload", fileUploadHandler)

    fmt.Println("Server running on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

アップロードハンドラーの作成

さあ、楽しい部分、ファイルのアップロードの処理に移りましょう。受信ファイルを処理し、ローカル ディレクトリに保存する fileUploadHandler 関数を作成します。

func fileUploadHandler(w http.ResponseWriter, r *http.Request) {
    // Limit file size to 10MB. This line saves you from those accidental 100MB uploads!
    r.ParseMultipartForm(10 



概要は次のとおりです:

  • r.FormFile("myFile") を使用してフォームからファイルを取得しています。
  • ファイルを取得したら、ローカル ファイルを開いて (または作成し)、内容をコピーします。
  • このセットアップは、ローカル ストレージ、簡単なプロトタイプ、またはまだクラウド ストレージの準備ができていないプロジェクトに最適です。

ファイルをローカルに保存する

ファイルの保存先を処理するヘルパー関数 createFile を作成しましょう:

import (
    "os"
    "path/filepath"
)

func createFile(filename string) (*os.File, error) {
    // Create an uploads directory if it doesn’t exist
    if _, err := os.Stat("uploads"); os.IsNotExist(err) {
        os.Mkdir("uploads", 0755)
    }

    // Build the file path and create it
    dst, err := os.Create(filepath.Join("uploads", filename))
    if err != nil {
        return nil, err
    }

    return dst, nil
}

ステップ 2: ファイルを検証して保護する ?️

セキュリティが鍵です!少し検証を追加して、承認されたファイル タイプのみが通過できるようにしましょう。

MIME タイプの検証

安全に保管したいですか?画像のアップロードを制限しましょう。方法は次のとおりです:

import (
    "io/ioutil"
    "strings"
)

func isValidFileType(file []byte) bool {
    fileType := http.DetectContentType(file)
    return strings.HasPrefix(fileType, "image/") // Only allow images
}

func fileUploadHandler(w http.ResponseWriter, r *http.Request) {
    // [Existing code here]

    // Read the file into a byte slice to validate its type
    fileBytes, err := ioutil.ReadAll(file)
    if err != nil {
        http.Error(w, "Invalid file", http.StatusBadRequest)
        return
    }

    if !isValidFileType(fileBytes) {
        http.Error(w, "Invalid file type", http.StatusUnsupportedMediaType)
        return
    }

    // Proceed with saving the file
    if _, err := dst.Write(fileBytes); err != nil {
        http.Error(w, "Error saving the file", http.StatusInternalServerError)
    }
}

ステップ 3: S3 を使用してクラウドに移行する ☁️

ローカル ストレージでも問題ありませんが、拡張したい場合は S3 が最適です。ファイルをクラウドに保存できるように、ファイル アップロード サービスを Amazon S3 に接続しましょう。

AWS SDKをインストールする

S3 を使用するには、AWS SDK が必要です:

go get -u github.com/aws/aws-sdk-go/aws
go get -u github.com/aws/aws-sdk-go/service/s3

S3 クライアントを構成する

S3 バケットに接続する関数を設定しましょう:

import (
    "bytes"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func uploadToS3(file []byte, filename string) error {
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-west-1"), // Your AWS region
    })
    if err != nil {
        return err
    }

    s3Client := s3.New(sess)
    _, err = s3Client.PutObject(&s3.PutObjectInput{
        Bucket: aws.String("your-bucket-name"),
        Key:    aws.String(filename),
        Body:   bytes.NewReader(file),
        ACL:    aws.String("public-read"),
    })
    return err
}

「your-bucket-name」を実際の S3 バケット名に置き換えます。次に、この関数を使用するようにアップロード ハンドラーを調整しましょう。

アップロードハンドラーを変更する

fileUploadHandler を更新して、ファイルをローカルではなく S3 に保存します:

func fileUploadHandler(w http.ResponseWriter, r *http.Request) {
    // [Existing code here]

    if err := uploadToS3(fileBytes, handler.Filename); err != nil {
        http.Error(w, "Error uploading to S3", http.StatusInternalServerError)
        return
    }
    fmt.Fprintf(w, "File successfully uploaded to S3!")
}

それで終わりです!これで、ローカル ストレージと Amazon S3 経由のクラウド ストレージの両方をサポートするファイル アップロード サービスが利用できるようになりました。 ?


試してみますか?

アップロード サービスをテストするには、curl:
を使用できます。

curl -X POST http://localhost:8080/upload -F "myFile=@path/to/your/file.jpg"

または、グラフィカル インターフェイスを好む場合は、簡単な HTML フォームを作成します:

ファイルをアップロードすると、ローカルまたは S3 バケットに保存されていることが確認できます。


まとめ

ファイル アップロード サービスの構築は、機能を追加し、ファイルの処理、検証、さらにはクラウド ストレージについて学ぶのに最適な方法です。基本を理解したので、次に何をするかを考えてみましょう。画像のサイズ変更、ビデオ処理、またはより大きな種類のファイルの処理など、限界はありません。

これまでにファイル アップロード サービスを構築したことがありますか? ヒントを下にコメントしてください。または、次に見てみたいものを教えてください。コーディングを楽しんでください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/neelp03/building-a-file-upload-service-in-go-34fj?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3