首頁  >  文章  >  後端開發  >  如何使用 Golang 實現非同步檔案上傳?

如何使用 Golang 實現非同步檔案上傳?

王林
王林原創
2024-06-05 13:20:57491瀏覽

如何用 Go 實作非同步檔案上傳?使用 http.MultipartFile 處理檔案上傳,它支援並發上傳。建立一個 goroutine 來非同步上傳文件,不會阻塞主線程。使用 io.Copy 將檔案內容寫入新檔案。上傳成功後列印日誌訊息。

如何使用 Golang 实现异步文件上传?

如何使用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 目錄,並且在上傳成功後列印一條日誌訊息。

執行範例

  1. 使用你最喜歡的 Go 環境安裝 Go。
  2. 複製或下載程式碼範例。
  3. 開啟終端機並導航到範例目錄。
  4. 運行 go run main.go
  5. 使用瀏覽器或HTTP 用戶端工具傳送一個POST 要求到http://localhost:8080/upload,其中包含一個名為file 的文件欄位。

如果檔案上傳成功,你應該會看到一則類似 檔案 example.txt 已成功上傳 的日誌訊息。

以上是如何使用 Golang 實現非同步檔案上傳?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn