add support to download directories as zip, tar, targz and tarbz2 #29

pull/144/head
Henrique Dias 2016-10-20 21:55:55 +01:00
parent 63a1a2cd54
commit 3379e6e67c
2 changed files with 55 additions and 0 deletions

49
file/download.go Normal file
View File

@ -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
}

View File

@ -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