aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcschiano <c.schiano@abc-arbitrage.com>2016-07-20 10:46:28 +0200
committercschiano <c.schiano@abc-arbitrage.com>2016-07-20 10:46:28 +0200
commitaf905a3ff719118bdde900f4c1387f738fbb83dd (patch)
tree9847cb7e85c0be95e1d16c651896cad4a146c835
parentc63cebaee11b03c44ead1d4563c22329ffd99220 (diff)
downloadseaweedfs-af905a3ff719118bdde900f4c1387f738fbb83dd.tar.xz
seaweedfs-af905a3ff719118bdde900f4c1387f738fbb83dd.zip
Add limit parameter and pagination for files
-rw-r--r--weed/server/filer_server_handlers_read.go59
-rw-r--r--weed/server/filer_ui/templates.go6
2 files changed, 37 insertions, 28 deletions
diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go
index 1470bcc48..98ec13f95 100644
--- a/weed/server/filer_server_handlers_read.go
+++ b/weed/server/filer_server_handlers_read.go
@@ -10,59 +10,66 @@ import (
"github.com/syndtr/goleveldb/leveldb"
)
-// listDirectoryHandler lists directories and folers under a directory
-// files are sorted by name and paginated via "lastFileName" and "limit".
-// sub directories are listed on the first page, when "lastFileName"
-// is empty.
-func (fs *FilerServer) listDirectoryHandler(w http.ResponseWriter, r *http.Request) {
+func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, isGetMethod bool) {
if !strings.HasSuffix(r.URL.Path, "/") {
return
}
- dirlist, err := fs.filer.ListDirectories(r.URL.Path)
- if err == leveldb.ErrNotFound {
- glog.V(3).Infoln("Directory Not Found in db", r.URL.Path)
- w.WriteHeader(http.StatusNotFound)
+
+ if fs.disableDirListing {
+ w.WriteHeader(http.StatusMethodNotAllowed)
return
}
- m := make(map[string]interface{})
- m["Directory"] = r.URL.Path
- lastFileName := r.FormValue("lastFileName")
- if lastFileName == "" {
- m["Subdirectories"] = dirlist
- }
+
limit, limit_err := strconv.Atoi(r.FormValue("limit"))
if limit_err != nil {
limit = 100
}
- m["Files"], _ = fs.filer.ListFiles(r.URL.Path, lastFileName, limit)
- writeJsonQuiet(w, r, http.StatusOK, m)
-}
-func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, isGetMethod bool) {
- fileLimit := 100
- files, err := fs.filer.ListFiles(r.URL.Path, "", fileLimit)
+ lastFileName := r.FormValue("lastFileName")
+ files, err := fs.filer.ListFiles(r.URL.Path, lastFileName, limit)
if err == leveldb.ErrNotFound {
glog.V(0).Infof("Error %s", err)
+ w.WriteHeader(http.StatusNotFound)
return
}
directories, err2 := fs.filer.ListDirectories(r.URL.Path)
if err2 == leveldb.ErrNotFound {
glog.V(0).Infof("Error %s", err)
+ w.WriteHeader(http.StatusNotFound)
return
}
+ shouldDisplayLoadMore := len(files) > 0
+
+ lastFileName = ""
+ if len(files) > 0 {
+ lastFileName = files[len(files)-1].Name
+
+ files2, err3 := fs.filer.ListFiles(r.URL.Path, lastFileName, limit)
+ if err3 == leveldb.ErrNotFound {
+ glog.V(0).Infof("Error %s", err)
+ w.WriteHeader(http.StatusNotFound)
+ return
+ }
+ shouldDisplayLoadMore = len(files2) > 0
+ }
+
args := struct {
- Path string
- Files interface{}
- Directories interface{}
- NotAllFilesDisplayed bool
+ Path string
+ Files interface{}
+ Directories interface{}
+ Limit int
+ LastFileName string
+ ShouldDisplayLoadMore bool
}{
r.URL.Path,
files,
directories,
- len(files) == fileLimit,
+ limit,
+ lastFileName,
+ shouldDisplayLoadMore,
}
ui.StatusTpl.Execute(w, args)
}
diff --git a/weed/server/filer_ui/templates.go b/weed/server/filer_ui/templates.go
index b4d16d4db..6f4f7ce86 100644
--- a/weed/server/filer_ui/templates.go
+++ b/weed/server/filer_ui/templates.go
@@ -42,9 +42,11 @@ var StatusTpl = template.Must(template.New("status").Parse(`<!DOCTYPE html>
</ul>
</div>
- {{if .NotAllFilesDisplayed}}
+{{if .ShouldDisplayLoadMore}}
<div class="row">
- Not all files are displayed.
+ <a href= {{ print .Path "?limit=" .Limit "&lastFileName=" .LastFileName}} >
+ Load more
+ </a>
</div>
{{end}}
</div>