diff options
-rw-r--r-- | system/admin/upload/backup.go | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/system/admin/upload/backup.go b/system/admin/upload/backup.go index a666073..28b1b8e 100644 --- a/system/admin/upload/backup.go +++ b/system/admin/upload/backup.go @@ -17,51 +17,85 @@ func Backup(res http.ResponseWriter) error { ts := time.Now().Unix() filename := fmt.Sprintf("uploads-%d.bak.tar.gz", ts) tmp := os.TempDir() + backup := filepath.Join(tmp, filename) // create uploads-{stamp}.bak.tar.gz - f, err := os.Create(filepath.Join(tmp, filename)) + f, err := os.Create(backup) if err != nil { return err } - defer f.Close() // loop through directory and gzip files // add all to uploads.bak.tar.gz tarball gz := gzip.NewWriter(f) tarball := tar.NewWriter(gz) + err = filepath.Walk("uploads", func(path string, info os.FileInfo, err error) error { if err != nil { return err } - h := &tar.Header{ - Name: info.Name(), - Size: info.Size(), - Mode: int64(info.Mode()), - ModTime: info.ModTime(), - } - - err = tarball.WriteHeader(h) + hdr, err := tar.FileInfoHeader(info, "") if err != nil { return err } - src, err := os.Open(path) + hdr.Name = path + + err = tarball.WriteHeader(hdr) if err != nil { return err } - _, err = io.Copy(tarball, src) + if !info.IsDir() { + src, err := os.Open(path) + if err != nil { + return err + } + defer src.Close() + _, err = io.Copy(tarball, src) + if err != nil { + return err + } - return err + err = tarball.Flush() + if err != nil { + return err + } + + err = gz.Flush() + if err != nil { + return err + } + } + + return nil }) + if err != nil { + fmt.Println(err) + return err + } + + err = gz.Close() + if err != nil { + return err + } + err = tarball.Close() + if err != nil { + return err + } + err = f.Close() + if err != nil { + return err + } // write data to response - data, err := os.Open(filepath.Join(tmp, filename)) + data, err := os.Open(backup) if err != nil { return err } defer data.Close() + defer os.Remove(backup) disposition := `attachment; filename=%s` info, err := data.Stat() @@ -74,5 +108,6 @@ func Backup(res http.ResponseWriter) error { res.Header().Set("Content-Length", fmt.Sprintf("%d", info.Size())) _, err = io.Copy(res, data) + return err } |