Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh memudahkan dan menjamin penyahmampatan fail menggunakan pakej zip Go?
Penyahmampatan Fail yang Mudah dan Berkesan dalam Go
Menyahmampatan arkib ZIP dalam Go boleh menjadi proses yang mudah. Satu pendekatan, seperti yang ditunjukkan oleh kod asal, melibatkan pengendalian penyahmampatan secara manual untuk setiap fail dalam arkib.
Walau bagaimanapun, terdapat cara yang lebih lancar dan cekap untuk mencapainya menggunakan penyelesaian yang dikemas kini berikut:
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 }
Penyelesaian yang dikemas kini ini menawarkan beberapa kelebihan:
Dengan peningkatan ini, kod ini menyediakan kaedah yang mudah, teguh dan selamat untuk menyahzip fail dalam Go.
Atas ialah kandungan terperinci Bagaimanakah saya boleh memudahkan dan menjamin penyahmampatan fail menggunakan pakej zip Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!