Goで同時並行のファイルアップロードを処理する方法

非同期処理でファイルアップロードを処理するには、goroutineを利用できます。サンプルコードを以下に示します。

package main
import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
)
func main() {
http.HandleFunc("/upload", uploadHandler)
http.ListenAndServe(":8080", nil)
}
func uploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
r.ParseMultipartForm(32 << 20) // 设置最大文件大小
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
filename := handler.Filename
savePath := filepath.Join("./uploads", filename)
out, err := os.Create(savePath)
if err != nil {
fmt.Println(err)
return
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
fmt.Println(err)
return
}
fmt.Fprintf(w, "文件上传成功!")
}
}

この例では、http.HandleFunc関数を用いて/uploadパスにuploadHandler関数をバインドします。uploadHandler関数では、r.ParseMultipartForm関数を使ってフォームデータを解析し、r.FormFile関数からアップロードされたファイルを取得します。

その後、 os.Create 関数でファイルを作成し、 io.Copy 関数でアップロードしたファイル内容を新規作成したファイルにコピーします。最後に、 fmt.Fprintf 関数でクライアントにアップロード成功のメッセージを返します。

このサンプルでは直列にコードを実行していますが、複数のファイルを同時に処理する必要がある場合は、ファイルをアップロードする処理をゴルーチンに配置できます。具体的には、使用する要件によって調整できます。

bannerAds