You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							109 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							109 lines
						
					
					
						
							2.8 KiB
						
					
					
				| package weed_server | |
| 
 | |
| import ( | |
| 	"errors" | |
| 	"github.com/seaweedfs/seaweedfs/weed/util/version" | |
| 	"net/http" | |
| 	"strconv" | |
| 	"strings" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/glog" | |
| 	ui "github.com/seaweedfs/seaweedfs/weed/server/filer_ui" | |
| 	"github.com/seaweedfs/seaweedfs/weed/stats" | |
| 	"github.com/seaweedfs/seaweedfs/weed/util" | |
| ) | |
| 
 | |
| // listDirectoryHandler lists directories and folders 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) { | |
| 	ctx := r.Context() | |
| 	if fs.option.ExposeDirectoryData == false { | |
| 		writeJsonError(w, r, http.StatusForbidden, errors.New("ui is disabled")) | |
| 		return | |
| 	} | |
| 
 | |
| 	stats.FilerHandlerCounter.WithLabelValues(stats.DirList).Inc() | |
| 
 | |
| 	path := r.URL.Path | |
| 	if strings.HasSuffix(path, "/") && len(path) > 1 { | |
| 		path = path[:len(path)-1] | |
| 	} | |
| 
 | |
| 	limit, limitErr := strconv.Atoi(r.FormValue("limit")) | |
| 	if limitErr != nil { | |
| 		limit = fs.option.DirListingLimit | |
| 	} | |
| 
 | |
| 	lastFileName := r.FormValue("lastFileName") | |
| 	namePattern := r.FormValue("namePattern") | |
| 	namePatternExclude := r.FormValue("namePatternExclude") | |
| 
 | |
| 	entries, shouldDisplayLoadMore, err := fs.filer.ListDirectoryEntries(ctx, util.FullPath(path), lastFileName, false, int64(limit), "", namePattern, namePatternExclude) | |
| 
 | |
| 	if err != nil { | |
| 		glog.V(0).InfofCtx(ctx, "listDirectory %s %s %d: %s", path, lastFileName, limit, err) | |
| 		w.WriteHeader(http.StatusNotFound) | |
| 		return | |
| 	} | |
| 
 | |
| 	if path == "/" { | |
| 		path = "" | |
| 	} | |
| 
 | |
| 	emptyFolder := true | |
| 	if len(entries) > 0 { | |
| 		lastFileName = entries[len(entries)-1].Name() | |
| 		emptyFolder = false | |
| 	} | |
| 
 | |
| 	glog.V(4).InfofCtx(ctx, "listDirectory %s, last file %s, limit %d: %d items", path, lastFileName, limit, len(entries)) | |
| 
 | |
| 	if r.Header.Get("Accept") == "application/json" { | |
| 		writeJsonQuiet(w, r, http.StatusOK, struct { | |
| 			Version               string | |
| 			Path                  string | |
| 			Entries               interface{} | |
| 			Limit                 int | |
| 			LastFileName          string | |
| 			ShouldDisplayLoadMore bool | |
| 			EmptyFolder           bool | |
| 		}{ | |
| 			version.Version(), | |
| 			path, | |
| 			entries, | |
| 			limit, | |
| 			lastFileName, | |
| 			shouldDisplayLoadMore, | |
| 			emptyFolder, | |
| 		}) | |
| 		return | |
| 	} | |
| 
 | |
| 	err = ui.StatusTpl.Execute(w, struct { | |
| 		Version               string | |
| 		Path                  string | |
| 		Breadcrumbs           []ui.Breadcrumb | |
| 		Entries               interface{} | |
| 		Limit                 int | |
| 		LastFileName          string | |
| 		ShouldDisplayLoadMore bool | |
| 		EmptyFolder           bool | |
| 		ShowDirectoryDelete   bool | |
| 	}{ | |
| 		version.Version(), | |
| 		path, | |
| 		ui.ToBreadcrumb(path), | |
| 		entries, | |
| 		limit, | |
| 		lastFileName, | |
| 		shouldDisplayLoadMore, | |
| 		emptyFolder, | |
| 		fs.option.ShowUIDirectoryDelete, | |
| 	}) | |
| 	if err != nil { | |
| 		glog.V(0).InfofCtx(ctx, "Template Execute Error: %v", err) | |
| 	} | |
| 
 | |
| }
 |