首頁  >  文章  >  後端開發  >  如何使用 Gin 在 HTTP 伺服器中即時產生 zip / 7z 檔案?

如何使用 Gin 在 HTTP 伺服器中即時產生 zip / 7z 檔案?

王林
王林轉載
2024-02-09 08:40:20673瀏覽

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

php小編蘋果為你帶來了使用Gin在HTTP伺服器中即時產生zip/7z存檔的簡潔指南。 Gin是一個輕量級的Go語言框架,具有高效能和易用性。本文將介紹如何使用Gin處理HTTP請求,並透過呼叫系統指令和第三方函式庫來產生zip和7z存檔檔。無論你是初學者還是有經驗的開發者,跟隨本教程,你將能夠輕鬆實現這一功能,並為你的網頁應用程式增添更多的價值。讓我們開始吧!

問題內容

我使用 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()
}

以上是如何使用 Gin 在 HTTP 伺服器中即時產生 zip / 7z 檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除