ファイルのアップロードについて話しましょう。次の Instagram、CMS、またはユーザー生成コンテンツを含むアプリを構築する場合は、ファイルを処理する必要があります。今日は、Go を使用した ファイル アップロードの世界に飛び込みます。ファイルをローカルに保存できるシンプルなファイル アップロード サービスをセットアップします。さらに、少し趣向を凝らして、Amazon S3 に接続して、完全なクラウド モードに移行できるようにします。 ?️
ゲームプランは次のとおりです:
コーヒーを飲んで、さあ、出かけましょう! ☕
まず最初に、/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概要は次のとおりです:
ファイルの保存先を処理するヘルパー関数 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 }
セキュリティが鍵です!少し検証を追加して、承認されたファイル タイプのみが通過できるようにしましょう。
安全に保管したいですか?画像のアップロードを制限しましょう。方法は次のとおりです:
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) } }
ローカル ストレージでも問題ありませんが、拡張したい場合は S3 が最適です。ファイルをクラウドに保存できるように、ファイル アップロード サービスを Amazon S3 に接続しましょう。
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 バケットに接続する関数を設定しましょう:
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 バケットに保存されていることが確認できます。
ファイル アップロード サービスの構築は、機能を追加し、ファイルの処理、検証、さらにはクラウド ストレージについて学ぶのに最適な方法です。基本を理解したので、次に何をするかを考えてみましょう。画像のサイズ変更、ビデオ処理、またはより大きな種類のファイルの処理など、限界はありません。
これまでにファイル アップロード サービスを構築したことがありますか? ヒントを下にコメントしてください。または、次に見てみたいものを教えてください。コーディングを楽しんでください!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3