卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34596本站已运行393

如何使用 Gin 在 HTTP 服务器中即时生成 zip / 7z 存档?

如何使用 gin 在 http 服务器中即时生成 zip / 7z 存档?

php小编苹果为你带来了使用Gin在HTTP服务器中即时生成zip/7z存档的简洁指南。Gin是一个轻量级的Go语言框架,具有高性能和易用性。本文将介绍如何使用Gin处理HTTP请求,并通过调用系统命令和第三方库来生成zip和7z存档文件。无论你是初学者还是有经验的开发者,跟随本教程,你将能够轻松实现这一功能,并为你的Web应用程序增添更多的价值。让我们开始吧!

问题内容

我使用 Gin 创建一个 HTTP 服务器,我想向用户提供动态生成的 zip 存档。

理论上,我可以首先在文件系统上生成一个 zip 文件,然后提供它。但这确实是一个糟糕的方法(在开始下载之前等待 5 分钟)。我想立即开始将其提供给用户并在生成内容时推送内容。

我找到了 DataFromReader(示例),但在存档完成之前不知道 ContentLength。

func DownloadEndpoint(c *gin.Context) {
    ...
    c.DataFromReader(
        http.StatusOK,
        ContentLength,
        ContentType,
        Body,
        map[string]string{
            "Content-Disposition": "attachment; filename="archive.zip""),
        },
    )
}

我怎样才能做到这一点?

解决方法

使用流方法和archive/zip 您可以动态创建 zip 并将其流式传输到服务器。

package main

import (
    "os"

    "archive/zip"

    "github.com/gin-gonic/gin"
)

func main() {

    r := gin.Default()
    r.GET("/", func(c *gin.Context) {

        c.Writer.Header().Set("Content-type", "application/octet-stream")
        c.Stream(func(w io.Writer) bool {

            // Create a zip archive.
            ar := zip.NewWriter(w)

            file1, _ := os.Open("filename1")
            file2, _ := os.Open("filename2")
            c.Writer.Header().Set("Content-Disposition", "attachment; filename='filename.zip'")

            f1, _ := ar.Create("filename1")
            io.Copy(f1, file1)
            f2, _ := ar.Create("filename2")
            io.Copy(f2, file2)

            ar.Close()

            return false
        })
    })
    r.Run()
}

直接使用ResponseWriter

package main

import (
    "io"
    "os"

    "archive/zip"

    "github.com/gin-gonic/gin"
)


func main() {

    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.Writer.Header().Set("Content-type", "application/octet-stream")
        c.Writer.Header().Set("Content-Disposition", "attachment; filename='filename.zip'")
        ar :=  zip.NewWriter(c.Writer)
        file1, _ := os.Open("filename1")
        file2, _ := os.Open("filename2")
        f1, _ := ar.Create("filename1")
        io.Copy(f1, file1)
        f2, _ := ar.Create("filename1")
        io.Copy(f1, file2)
        ar.Close()
    })
    r.Run()
}
卓越飞翔博客
上一篇: Golang Slice 索引价值还是参考?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏