Einfache und effektive Dateidekomprimierung in Go
Das Dekomprimieren von ZIP-Archiven in Go kann ein unkomplizierter Vorgang sein. Ein Ansatz besteht, wie im Originalcode gezeigt, darin, die Dekomprimierung für jede Datei im Archiv manuell durchzuführen.
Es gibt jedoch eine nahtlosere und effizientere Möglichkeit, dies mit der folgenden aktualisierten Lösung zu erreichen:
func Unzip(src, dest string) error { r, err := zip.OpenReader(src) if err != nil { return err } defer func() { if err := r.Close(); err != nil { panic(err) } }() os.MkdirAll(dest, 0755) // Closure to wrap file extraction and writing, avoiding deferred stack overflow extractAndWriteFile := func(f *zip.File) error { rc, err := f.Open() if err != nil { return err } defer func() { if err := rc.Close(); err != nil { panic(err) } }() path := filepath.Join(dest, f.Name) // Check for directory traversal (ZipSlip) vulnerability if !strings.HasPrefix(path, filepath.Clean(dest)+string(os.PathSeparator)) { return fmt.Errorf("illegal file path: %s", path) } if f.FileInfo().IsDir() { os.MkdirAll(path, f.Mode()) } else { os.MkdirAll(filepath.Dir(path), f.Mode()) f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) if err != nil { return err } defer func() { if err := f.Close(); err != nil { panic(err) } }() _, err = io.Copy(f, rc) if err != nil { return err } } return nil } for _, f := range r.File { err := extractAndWriteFile(f) if err != nil { return err } } return nil }
Diese aktualisierte Lösung bietet mehrere Vorteile:
Mit diesen Verbesserungen bietet dieser Code eine einfache, robuste und sichere Methode zum Entpacken von Dateien in Go.
Das obige ist der detaillierte Inhalt vonWie kann ich die Dateidekomprimierung mit dem Zip-Paket von Go vereinfachen und sichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!