From 3379e6e67c062d87d3634e7ce6814abad19e733e Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 20 Oct 2016 21:55:55 +0100 Subject: [PATCH] add support to download directories as zip, tar, targz and tarbz2 #29 --- file/download.go | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ filemanager.go | 6 ++++++ 2 files changed, 55 insertions(+) create mode 100644 file/download.go diff --git a/file/download.go b/file/download.go new file mode 100644 index 00000000..e46bbbca --- /dev/null +++ b/file/download.go @@ -0,0 +1,49 @@ +package file + +import ( + "io" + "io/ioutil" + "net/http" + "os" + + "github.com/mholt/archiver" +) + +func (i *Info) DownloadAs(w http.ResponseWriter, query string) (int, error) { + var ( + extension string + temp string + err error + ) + + temp, err = ioutil.TempDir("", "") + if err != nil { + return http.StatusInternalServerError, err + } + + switch query { + case "zip": + extension, err = ".zip", archiver.Zip.Make(temp+"/temp", []string{i.Path}) + case "tar": + extension, err = ".tar", archiver.Tar.Make(temp+"/temp", []string{i.Path}) + case "targz": + extension, err = ".tar.gz", archiver.TarGz.Make(temp+"/temp", []string{i.Path}) + case "tarbz2": + extension, err = ".tar.bz2", archiver.TarBz2.Make(temp+"/temp", []string{i.Path}) + default: + return http.StatusNotImplemented, nil + } + + if err != nil { + return http.StatusInternalServerError, err + } + + file, err := os.Open(temp + "/temp") + if err != nil { + return http.StatusInternalServerError, err + } + + w.Header().Set("Content-Disposition", "attachment; filename="+i.Name()+extension) + io.Copy(w, file) + return http.StatusOK, nil +} diff --git a/filemanager.go b/filemanager.go index e3ac8d32..a915ba5b 100644 --- a/filemanager.go +++ b/filemanager.go @@ -126,6 +126,12 @@ func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err // Generate anti security token. c.GenerateToken() + if fi.IsDir() { + if val, ok := r.URL.Query()["download"]; ok && val[0] != "" { + return fi.DownloadAs(w, val[0]) + } + } + if !fi.IsDir() { query := r.URL.Query() webdav := false