mirror of
https://github.com/rclone/rclone.git
synced 2025-12-06 00:03:32 +00:00
serve webdav: implement download-directory-as-zip
Signed-off-by: Leo <i@hardrain980.com>
This commit is contained in:
@@ -45,6 +45,10 @@ var OptionsInfo = fs.Options{{
|
|||||||
Name: "disable_dir_list",
|
Name: "disable_dir_list",
|
||||||
Default: false,
|
Default: false,
|
||||||
Help: "Disable HTML directory list on GET request for a directory",
|
Help: "Disable HTML directory list on GET request for a directory",
|
||||||
|
}, {
|
||||||
|
Name: "disable_zip",
|
||||||
|
Default: false,
|
||||||
|
Help: "Disable zip download of directories",
|
||||||
}}.
|
}}.
|
||||||
Add(libhttp.ConfigInfo).
|
Add(libhttp.ConfigInfo).
|
||||||
Add(libhttp.AuthConfigInfo).
|
Add(libhttp.AuthConfigInfo).
|
||||||
@@ -57,6 +61,7 @@ type Options struct {
|
|||||||
Template libhttp.TemplateConfig
|
Template libhttp.TemplateConfig
|
||||||
EtagHash string `config:"etag_hash"`
|
EtagHash string `config:"etag_hash"`
|
||||||
DisableDirList bool `config:"disable_dir_list"`
|
DisableDirList bool `config:"disable_dir_list"`
|
||||||
|
DisableZip bool `config:"disable_zip"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opt is options set by command line flags
|
// Opt is options set by command line flags
|
||||||
@@ -408,6 +413,24 @@ func (w *WebDAV) serveDir(rw http.ResponseWriter, r *http.Request, dirRemote str
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
dir := node.(*vfs.Dir)
|
dir := node.(*vfs.Dir)
|
||||||
|
|
||||||
|
if r.URL.Query().Get("download") == "zip" && !w.opt.DisableZip {
|
||||||
|
fs.Infof(dirRemote, "%s: Zipping directory", r.RemoteAddr)
|
||||||
|
zipName := path.Base(dirRemote)
|
||||||
|
if dirRemote == "" {
|
||||||
|
zipName = "root"
|
||||||
|
}
|
||||||
|
rw.Header().Set("Content-Disposition", "attachment; filename=\""+zipName+".zip\"")
|
||||||
|
rw.Header().Set("Content-Type", "application/zip")
|
||||||
|
rw.Header().Set("Last-Modified", time.Now().UTC().Format(http.TimeFormat))
|
||||||
|
err := vfs.CreateZip(ctx, dir, rw)
|
||||||
|
if err != nil {
|
||||||
|
serve.Error(ctx, dirRemote, rw, "Failed to create zip", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
dirEntries, err := dir.ReadDirAll()
|
dirEntries, err := dir.ReadDirAll()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -417,6 +440,7 @@ func (w *WebDAV) serveDir(rw http.ResponseWriter, r *http.Request, dirRemote str
|
|||||||
|
|
||||||
// Make the entries for display
|
// Make the entries for display
|
||||||
directory := serve.NewDirectory(dirRemote, w.server.HTMLTemplate())
|
directory := serve.NewDirectory(dirRemote, w.server.HTMLTemplate())
|
||||||
|
directory.DisableZip = w.opt.DisableZip
|
||||||
for _, node := range dirEntries {
|
for _, node := range dirEntries {
|
||||||
if vfscommon.Opt.NoModTime {
|
if vfscommon.Opt.NoModTime {
|
||||||
directory.AddHTMLEntry(node.Path(), node.IsDir(), node.Size(), time.Time{})
|
directory.AddHTMLEntry(node.Path(), node.IsDir(), node.Size(), time.Time{})
|
||||||
|
|||||||
Reference in New Issue
Block a user