Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh menyahzip fail dengan cekap dalam Go dengan pengendalian ralat dan pertimbangan keselamatan yang betul?
Nyahzip Fail Dengan Mudah dengan Go
Menyahzip fail dalam Go ialah tugas mudah dengan alatan yang betul. Pakej zip dalam Go menyediakan cara yang mudah untuk mengekstrak fail daripada arkib ZIP.
Kod Semasa
Coretan kod yang disediakan memulakan pembaca zip, berulang ke atas fail dalam arkib, dan mengekstraknya ke destinasi yang ditetapkan. Kenyataan penangguhan bersarang boleh membawa kepada isu, seperti yang dinyatakan oleh @Nick Craig-Wood.
Penyelesaian yang Diperbaiki
Untuk menangani isu ini, penutupan diperkenalkan untuk merangkum pengekstrakan fail dan logik penulisan. Selain itu, pengendalian ralat ditambahkan pada panggilan Close() untuk kedua-dua pembaca zip dan pembaca fail individu:
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) 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) } }() ... (Code for file extraction and writing goes here) ... return nil } for _, f := range r.File { err := extractAndWriteFile(f) if err != nil { return err } } return nil }
Penyelesaian yang dipertingkatkan ini mencipta direktori destinasi jika ia tidak wujud dan memastikan pengendalian ralat yang betul untuk semua deskriptor fail dan pembersihan penutupan.
Pertimbangan Tambahan
Kod yang dikemas kini juga termasuk pengesanan ZipSlip untuk mengelakkan traversal direktori dan potensi risiko keselamatan yang dikaitkan dengan mengekstrak fail di luar laluan destinasi yang ditetapkan.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menyahzip fail dengan cekap dalam Go dengan pengendalian ralat dan pertimbangan keselamatan yang betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!