From 8f9ffc587e622b6e48e9816fe69bbb9cff3073fe Mon Sep 17 00:00:00 2001 From: Steffen Busch <37350514+steffenbusch@users.noreply.github.com> Date: Sat, 30 Dec 2023 19:47:13 +0100 Subject: [PATCH] fileserver: Add total file size to directory listing (#6003) * browse: Add total file size to directory listing * Apply suggestion to remove "in " Co-authored-by: Matt Holt --------- Co-authored-by: Matt Holt --- modules/caddyhttp/fileserver/browse.html | 3 +++ modules/caddyhttp/fileserver/browsetplcontext.go | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/modules/caddyhttp/fileserver/browse.html b/modules/caddyhttp/fileserver/browse.html index e0e12969e..af1772bfd 100644 --- a/modules/caddyhttp/fileserver/browse.html +++ b/modules/caddyhttp/fileserver/browse.html @@ -790,6 +790,9 @@ footer { {{.NumFiles}} file{{if ne 1 .NumFiles}}s{{end}} + + {{.HumanTotalFileSize}} total + {{- if ne 0 .Limit}} (of which only {{.Limit}} are displayed) diff --git a/modules/caddyhttp/fileserver/browsetplcontext.go b/modules/caddyhttp/fileserver/browsetplcontext.go index 682273c0a..a74fe3164 100644 --- a/modules/caddyhttp/fileserver/browsetplcontext.go +++ b/modules/caddyhttp/fileserver/browsetplcontext.go @@ -86,6 +86,10 @@ func (fsrv *FileServer) directoryListing(ctx context.Context, entries []fs.DirEn // was already set above. } + if !isDir { + tplCtx.TotalFileSize += size + } + u := url.URL{Path: "./" + name} // prepend with "./" to fix paths with ':' in the name tplCtx.Items = append(tplCtx.Items, fileInfo{ @@ -129,6 +133,9 @@ type browseTemplateContext struct { // The number of files (items that aren't directories) in the listing. NumFiles int `json:"num_files"` + // The total size of all files in the listing. + TotalFileSize int64 `json:"total_file_size"` + // Sort column used Sort string `json:"sort,omitempty"` @@ -252,6 +259,13 @@ func (fi fileInfo) HumanSize() string { return humanize.IBytes(uint64(fi.Size)) } +// HumanTotalFileSize returns the total size of all files +// in the listing as a human-readable string in IEC format +// (i.e. power of 2 or base 1024). +func (btc browseTemplateContext) HumanTotalFileSize() string { + return humanize.IBytes(uint64(btc.TotalFileSize)) +} + // HumanModTime returns the modified time of the file // as a human-readable string given by format. func (fi fileInfo) HumanModTime(format string) string {