1
0
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:
Leo
2025-12-01 11:17:10 +08:00
committed by dougal
parent a99d155fd4
commit 24c752ed9e

View File

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