如何用 Go 實作非同步檔案上傳?使用 http.MultipartFile 處理檔案上傳,它支援並發上傳。建立一個 goroutine 來非同步上傳文件,不會阻塞主線程。使用 io.Copy 將檔案內容寫入新檔案。上傳成功後列印日誌訊息。
如何使用Golang 實作非同步檔案上傳
非同步檔案上傳是一種技術,允許你在不阻塞主執行緒的情況下向伺服器上傳文件。這對於大檔案上傳或需要在上傳期間繼續執行任務的應用程式很有用。 Go 語言提供了內建的 http.MultipartFile
類型來處理檔案上傳,它支援並發上傳。
程式碼範例
以下是使用Go 語言實作非同步檔案上傳的範例:
package main import ( "context" "fmt" "io" "log" "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() // 文件上传处理程序 router.POST("/upload", func(c *gin.Context) { // 获取 multipart 文件 file, header, err := c.Request.FormFile("file") if err != nil { c.JSON(http.StatusBadRequest, gin.H{ "error": fmt.Sprintf("获取文件失败: %s", err.Error()), }) return } // 创建一个 goroutine 来异步上传文件 go func() { ctx := context.Background() // 创建一个新文件并在其中写入 dst, err := os.Create(fmt.Sprintf("uploads/%s", header.Filename)) if err != nil { log.Printf("创建文件失败: %s", err.Error()) return } defer dst.Close() if _, err := io.Copy(dst, file); err != nil { log.Printf("写入文件失败: %s", err.Error()) return } log.Printf("文件 %s 已成功上传", header.Filename) }() c.JSON(http.StatusOK, gin.H{ "status": "success", }) }) router.Run(":8080") }
實戰案例
這個範例是一個簡單的檔案上傳服務,可以透過POST
要求將檔案上傳到伺服器。檔案被非同步上傳到 uploads
目錄,並且在上傳成功後列印一條日誌訊息。
執行範例
go run main.go
。 POST
要求到http://localhost:8080/upload
,其中包含一個名為file
的文件欄位。 如果檔案上傳成功,你應該會看到一則類似 檔案 example.txt 已成功上傳
的日誌訊息。
以上是如何使用 Golang 實現非同步檔案上傳?的詳細內容。更多資訊請關注PHP中文網其他相關文章!