Golang provides two methods to handle HTTP file downloads: using the net/http library, file requests can be handled through the http.FileServer() method. Use the third-party library github.com/CloudyKit/jet to provide advanced features such as pausing and resuming downloads, and you can use the jet.Get() method to handle file downloads.
How to use Golang to process HTTP file downloads
Introduction
Processing HTTP files Downloading is a common task in web development. Golang provides several ways to achieve this. This article will introduce two methods of handling HTTP file downloads using the net/http
library and the third-party library github.com/CloudyKit/jet
.
Using the net/http
library
To use the net/http
library to handle file downloads, you can use http.FileServer()
method. This method accepts a file system pointer as a parameter and uses it to handle file requests.
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)) }
In this approach, all requests under the /files
URL prefix will be handled by http.FileServer()
.
Using github.com/CloudyKit/jet
The library
github.com/CloudyKit/jet
is a library for A third-party library that handles file downloads. It provides higher-level features such as pausing and resuming downloads.
import ( "log" "net/http" "github.com/CloudyKit/jet/v6" ) func main() { engine := jet.NewEngine() http.Handle("/", engine) log.Fatal(http.ListenAndServe(":8080", nil)) }
In jet
, you can use the jet.Get()
method to handle file downloads. To specify a file, use the filepath.Abs()
function to get the absolute path to the file.
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)) }
Practical case
Imagine an online file storage platform. Users can upload files and access uploaded files. Using the github.com/CloudyKit/jet
library, you can easily implement the file download function.
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)) }
In this example, the fileStore
structure is used to store the uploaded file. The file download handler (engine.Get("/download/:file")
) gets the requested file from the file store and serves it to the client.
The above is the detailed content of How to handle HTTP file downloads using Golang?. For more information, please follow other related articles on the PHP Chinese website!