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!
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?
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!