下面我将为您详细讲解如何使用 Gin 框架快速创建静态文件下载 Web 服务。
准备工作
在开始之前,您需要先安装好 Go 和 Gin 框架。如果您还没有安装,可以参考以下文章进行安装:
Step 1:创建一个空的 Gin 项目
首先,您需要创建一个空的 Gin 项目。在命令行里执行以下命令:
mkdir gin-demo
cd gin-demo
go mod init gin-demo
这里我们以 "gin-demo" 为项目名称,您可以根据自己的需要来修改。
Step 2:创建下载文件服务
接下来,我们需要创建一个可以下载静态文件的服务。假设您需要提供 "example.zip" 这个文件供用户下载,您可以在项目目录下创建 "files" 文件夹,并将该文件放在 "files" 文件夹下。
接着,在项目目录下创建 "main.go" 文件,并添加以下代码:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.Static("/files", "./files")
router.GET("/download", func(c *gin.Context) {
fileName := "example.zip"
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))
c.Writer.Header().Add("Content-Type", "application/octet-stream")
c.File("./files/" + fileName)
})
router.Run(":8080")
}
以上代码中:
router.Static
方法会将静态文件目录 "/files" 映射到 "./files" 文件夹,即用户访问 "/files" 路径时会自动展示 "./files" 文件夹下的文件列表。router.GET
方法会创建一个 GET 请求路由 "/download",用于用户下载文件。- 在响应 "/download" 请求时,我们通过
c.Writer.Header()
方法设置了响应头信息,其中Content-Disposition
表示该响应为附件,filename
参数表示下载文件的名称,Content-Type
则指定了该响应的 MIME 类型。 - 最后,调用
c.File
方法将文件数据以 "application/octet-stream" 类型写入到响应体中。
Step 3:启动服务
保存并运行 "main.go",在命令行输入:
go run main.go
成功启动后,您可以在浏览器中访问 "http://localhost:8080/download",即可开始下载名为 "example.zip" 的文件。
示例 2:将多个文件打包成 Zip 并提供下载
接下来,我们将继续拓展示例 1,将多个文件打包成 Zip 格式的压缩包并提供下载。
首先,您需要先安装 "archive/zip" 包,可以在命令行里运行以下命令进行安装:
go get archive/zip
接着,您可以在 "files" 目录下新建两个文件 "example.txt" 和 "example2.txt"。
接下来,在 "main.go" 文件中新增一个路由 "/zip",代码如下:
router.GET("/zip", func(c *gin.Context) {
zipFileName := "files.zip"
zipFilePath := "./" + zipFileName
err := zipFiles(zipFilePath, []string{"./files/example.txt", "./files/example2.txt"})
if err != nil {
c.String(http.StatusInternalServerError, err.Error())
return
}
defer func() {
err = os.Remove(zipFilePath)
if err != nil {
log.Println("failed to remove zip file: ", err)
}
}()
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", zipFileName))
c.Writer.Header().Add("Content-Type", "application/octet-stream")
c.File(zipFileName)
})
func zipFiles(filename string, files []string) error {
newZipFile, err := os.Create(filename)
if err != nil {
return err
}
defer newZipFile.Close()
zipWriter := zip.NewWriter(newZipFile)
defer zipWriter.Close()
for _, file := range files {
if err := addFileToZip(zipWriter, file); err != nil {
return err
}
}
return nil
}
func addFileToZip(zipWriter *zip.Writer, filename string) error {
fileToZip, err := os.Open(filename)
if err != nil {
return err
}
defer fileToZip.Close()
info, err := fileToZip.Stat()
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = filename
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
if _, err := io.Copy(writer, fileToZip); err != nil {
return err
}
return nil
}
以上代码中:
router.GET
方法会创建一个 GET 请求路由 "/zip",用于用户打包下载文件。- 在响应 "/zip" 请求时,我们通过
zipFiles
方法将多个文件打包成 Zip 格式的压缩包并存储在服务端("./files.zip"),之后将文件数据以 "application/octet-stream" 类型写入响应体中传输到客户端即可。 zipFiles
方法会遍历文件列表,将每一个文件添加到 "zipWriter" 实例中,最后将 "zipWriter" 内容写入文件。addFileToZip
方法则用于将单个文件添加到 "zipWriter" 中。
Step 4:启动服务并测试
保存并运行 "main.go",在命令行输入:
go run main.go
成功启动后,您可以在浏览器中访问 "http://localhost:8080/zip",即可开始下载名为 "files.zip" 的压缩包。解压后会得到 "example.txt" 和 "example2.txt" 两个文件。
这就是使用 Gin 框架快速创建静态文件下载 Web 服务的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Gin 框架快速创建静态文件下载Web服务 - Python技术站