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 = "
Filename | Size | Date | "
+ case (key[0] == "filename" && order[0] == "desc"):
+ sort.Slice(dirs, func(i, j int) bool { return dirs[i].Name() > dirs[j].Name() })
+ tableheader = "Filename | Size | Date | "
+
+ case (key[0] == "size" && order[0] == "asc"):
+ sort.Slice(dirs, func(i, j int) bool { return dirs[i].Size() < dirs[j].Size() })
+ tableheader = "Filename | Size | Date | "
+
+ case (key[0] == "size" && order[0] == "desc"):
+ sort.Slice(dirs, func(i, j int) bool { return dirs[i].Size() > dirs[j].Size() })
+ tableheader = "Filename | Size | Date | "
+
+ 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 = "Filename | Size | Date | "
+
+ 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 = "Filename | Size | Date | "
+
+ }
+
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, "\nFilename | Size | Date | ")
+
+ fmt.Fprintf(w, "%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, "%s | %d | %s |
", url.String(), htmlReplacer.Replace(name), d.Size(), d.ModTime().String())
+ fmt.Fprintf(w, "%s | %d | %s |
", 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))
}