首頁  >  文章  >  後端開發  >  如何使用 Golang 處理 HTTP 檔案下載?

如何使用 Golang 處理 HTTP 檔案下載?

WBOY
WBOY原創
2024-06-01 22:24:00648瀏覽

Golang 提供兩種方法處理 HTTP 檔案下載:使用 net/http 程式庫,可透過 http.FileServer() 方法處理檔案請求。使用第三方函式庫 github.com/CloudyKit/jet,提供暫停和恢復下載等進階特性,可使用 jet.Get() 方法處理檔案下載。

如何使用 Golang 处理 HTTP 文件下载?

如何使用Golang 處理HTTP 檔案下載

介紹

處理HTTP 文件下載是Web 開發中的常見任務。 Golang 提供了多種方法來實現此目的。本文將介紹使用 net/http 函式庫和第三方函式庫 github.com/CloudyKit/jet 處理 HTTP 檔案下載的兩種方法。

使用net/http

要使用net/http 庫處理文件下載,可以使用 http.FileServer() 方法。此方法接受一個檔案系統指標作為參數,並將其用於處理檔案請求。

import (
    "log"
    "net/http"
)

func main() {
    fs := http.FileServer(http.Dir("./files"))
    http.Handle("/files/", http.StripPrefix("/files", fs))
    log.Fatal(http.ListenAndServe(":8080", nil))
}

在這個方法中,/files URL 前綴下的所有請求將由 http.FileServer() 處理。

使用github.com/CloudyKit/jet 函式庫

github.com/CloudyKit/jet 是一個用於處理文件下載的第三方函式庫。它提供了更高層級的特性,例如暫停和恢復下載。

import (
    "log"
    "net/http"

    "github.com/CloudyKit/jet/v6"
)

func main() {
    engine := jet.NewEngine()
    http.Handle("/", engine)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

jet 中,可以使用 jet.Get() 方法處理檔案下載。若要指定文件,請使用 filepath.Abs​​() 函數取得文件的絕對路徑。

import (
    "log"
    "net/http"
    "os"

    "github.com/CloudyKit/jet/v6"
)

func main() {
    engine := jet.NewEngine()
    engine.Get("/", func(c *jet.Context) error {
        filePath, err := filepath.Abs("file.txt")
        if err != nil {
            return err
        }
        f, err := os.Open(filePath)
        if err != nil {
            return err
        }
        defer f.Close()
        return engine.ServeContent(c.ResponseWriter(), c.Request(), "file.txt", time.Now(), f)
    })
    log.Fatal(http.ListenAndServe(":8080", engine))
}

實戰案例

想想像一個線上檔案儲存平台。使用者可以上傳檔案並存取已上傳的檔案。使用 github.com/CloudyKit/jet 函式庫,可以輕鬆實現檔案下載功能。

package main

import (
    "log"
    "net/http"

    "github.com/CloudyKit/jet/v6"
)

type fileStore struct {
    files map[string][]byte
}

func main() {
    fs := &fileStore{files: make(map[string][]byte)}
    engine := jet.NewEngine()
    engine.Get("/", func(c *jet.Context) error {
        // 返回可用文件列表
    })
    engine.Post("/", func(c *jet.Context) error {
        // 将文件保存到文件存储中
    })
    engine.Get("/download/:file", func(c *jet.Context) error {
        file := c.Params["file"]
        data, ok := fs.files[file]
        if !ok {
            return http.StatusNotFound
        }
        return engine.ServeContent(c.ResponseWriter(), c.Request(), file, time.Now(), data)
    })
    log.Fatal(http.ListenAndServe(":8080", engine))
}

在本例中,fileStore 結構用於儲存上傳的檔案。檔案下載處理程序(engine.Get("/download/:file"))從檔案儲存中取得請求的檔案並將其提供給客戶端。

以上是如何使用 Golang 處理 HTTP 檔案下載?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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