From 73ab6461baee168c4504162653dcf9060325b461 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 2 Sep 2018 19:10:41 +0000 Subject: [PATCH] Initial add of sorting --- enhanced-file-server.go | 42 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/enhanced-file-server.go b/enhanced-file-server.go index 80096e9..0166d08 100644 --- a/enhanced-file-server.go +++ b/enhanced-file-server.go @@ -50,16 +50,54 @@ func mapDirOpenError(originalErr error, name string) error { } func dirList(w http.ResponseWriter, r *http.Request, f http.File) { + tableheader := "" dirs, err := f.Readdir(-1) if err != nil { logf(r, "http: error reading directory: %v", err) http.Error(w, "Error reading directory", http.StatusInternalServerError) return } + // Check for sort parameters + key, ok := r.URL.Query()["key"] + if !ok || (key[0] != "filename" && key[0] != "date" && key[0] != "size") { + key[0] = "filename" + } + + order, ok := r.URL.Query()["key"] + if !ok || (order[0] != "asc" && order[0] != "desc") { + order[0] = "asc" + } + switch { + case (key[0] == "filename" && order[0] == "asc"): + sort.Slice(dirs, func(i, j int) bool { return dirs[i].Name() < dirs[j].Name() }) + tableheader = "FilenameSizeDate" + case (key[0] == "filename" && order[0] == "desc"): + sort.Slice(dirs, func(i, j int) bool { return dirs[i].Name() > dirs[j].Name() }) + tableheader = "FilenameSizeDate" + + case (key[0] == "size" && order[0] == "asc"): + sort.Slice(dirs, func(i, j int) bool { return dirs[i].Size() < dirs[j].Size() }) + tableheader = "FilenameSizeDate" + + case (key[0] == "size" && order[0] == "desc"): + sort.Slice(dirs, func(i, j int) bool { return dirs[i].Size() > dirs[j].Size() }) + tableheader = "FilenameSizeDate" + + case (key[0] == "date" && order[0] == "asc"): + sort.Slice(dirs, func(i, j int) bool { return dirs[i].ModTime().UnixNano() < dirs[j].ModTime().UnixNano() }) + tableheader = "FilenameSizeDate" + + case (key[0] == "date" && order[0] == "desc"): + sort.Slice(dirs, func(i, j int) bool { return dirs[i].ModTime().UnixNano() > dirs[j].ModTime().UnixNano() }) + tableheader = "FilenameSizeDate" + + } + sort.Slice(dirs, func(i, j int) bool { return dirs[i].Name() < dirs[j].Name() }) w.Header().Set("Content-Type", "text/html; charset=utf-8") - fmt.Fprintf(w, "\n") + + fmt.Fprintf(w, "
FilenameSizeDate
%s\n", tableheader) for _, d := range dirs { name := d.Name() if d.IsDir() { @@ -69,7 +107,7 @@ func dirList(w http.ResponseWriter, r *http.Request, f http.File) { // part of the URL path, and not indicate the start of a query // string or fragment. url := url.URL{Path: name} - fmt.Fprintf(w, "", url.String(), htmlReplacer.Replace(name), d.Size(), d.ModTime().String()) + fmt.Fprintf(w, "", url.String(), htmlReplacer.Replace(name), d.Size(), d.ModTime().Format("2006-01-02 15:04:05")) // fmt.Fprintf(w, "%s\n", url.String(), htmlReplacer.Replace(name)) }
%s%d%s
%s%d%s