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