Home  >  Article  >  Backend Development  >  How to handle HTTP file downloads using Golang?

How to handle HTTP file downloads using Golang?

WBOY
WBOYOriginal
2024-06-01 22:24:00594browse

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.

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

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn