Heim >Backend-Entwicklung >Golang >Wie erstelle ich mit Gin im Handumdrehen ein Zip/7z-Archiv auf einem HTTP-Server?

Wie erstelle ich mit Gin im Handumdrehen ein Zip/7z-Archiv auf einem HTTP-Server?

王林
王林nach vorne
2024-02-09 08:40:20698Durchsuche

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

PHP-Editor Apple bietet Ihnen eine kurze Anleitung zur Verwendung von Gin, um sofort ZIP/7Z-Archive auf HTTP-Servern zu generieren. Gin ist ein leichtes Go-Sprachframework mit hoher Leistung und Benutzerfreundlichkeit. In diesem Artikel erfahren Sie, wie Sie mit Gin HTTP-Anfragen verarbeiten und Zip- und 7z-Archivdateien durch Aufrufen von Systembefehlen und Bibliotheken von Drittanbietern generieren. Ganz gleich, ob Sie Anfänger oder erfahrener Entwickler sind: Wenn Sie diesem Tutorial folgen, können Sie diese Funktion problemlos implementieren und Ihrer Webanwendung mehr Wert verleihen. Lasst uns beginnen!

Frageninhalt

Ich verwende Gin, um einen HTTP-Server zu erstellen, und ich möchte den Benutzern dynamisch generierte Zip-Archive bereitstellen.

Theoretisch könnte ich zunächst eine ZIP-Datei im Dateisystem erstellen und diese dann bereitstellen. Aber das ist wirklich ein schlechter Ansatz (warten Sie 5 Minuten, bevor Sie mit dem Download beginnen). Ich möchte sofort damit beginnen, es den Benutzern bereitzustellen und den Inhalt zu pushen, sobald er generiert wird.

Ich habe den DataFromReader (Beispiel) gefunden, kenne aber die ContentLength erst, wenn das Archiv vollständig ist.

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

Wie kann ich das machen?

Workaround

Mit der Stream-Methode und Archive/Zip können Sie dynamisch eine ZIP-Datei erstellen und diese auf den Server streamen.

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()
}

Verwenden Sie ResponseWriter direkt

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()
}

Das obige ist der detaillierte Inhalt vonWie erstelle ich mit Gin im Handumdrehen ein Zip/7z-Archiv auf einem HTTP-Server?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen