123 lines
3.1 KiB
Go
123 lines
3.1 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
filesApi "github.com/filebrowser/filebrowser/v2/api/files"
|
|
"github.com/filebrowser/filebrowser/v2/files"
|
|
"github.com/filebrowser/filebrowser/v2/rules"
|
|
"github.com/filebrowser/filebrowser/v2/search"
|
|
"github.com/spf13/afero"
|
|
)
|
|
|
|
type FilesProvider struct {
|
|
filesApi.UnimplementedFileServer
|
|
}
|
|
|
|
const BASE_PATH = "../"
|
|
|
|
func (f *FilesProvider) List(ctx context.Context, req *filesApi.FileListReq) (*filesApi.FileListResp, error) {
|
|
file, err := files.NewFileInfo(&files.FileOptions{
|
|
Fs: getFs(req.UserSpacePath),
|
|
Path: req.Path,
|
|
Modify: true,
|
|
Expand: true,
|
|
ReadHeader: true,
|
|
Content: true,
|
|
Checker: rules.EmptyChecker,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !file.IsDir {
|
|
return nil, errors.New("路径不是文件夹")
|
|
}
|
|
file.Listing.Sorting.Asc = req.Sorting.Asc
|
|
file.Listing.Sorting.By = req.Sorting.By
|
|
file.Listing.ApplySort()
|
|
result := &filesApi.FileListResp{
|
|
NumDirs: int32(file.NumDirs),
|
|
NumFiles: int32(file.NumFiles),
|
|
Sorting: &filesApi.Sorting{
|
|
By: file.Sorting.By,
|
|
Asc: file.Sorting.Asc,
|
|
},
|
|
Path: file.Path,
|
|
Name: file.Name,
|
|
Size: file.Size,
|
|
Extension: file.Extension,
|
|
Mode: file.Mode.String(),
|
|
IsDir: file.IsDir,
|
|
IsSymlink: file.IsSymlink,
|
|
Type: file.Type,
|
|
Items: make([]*filesApi.Items, len(file.Listing.Items)),
|
|
}
|
|
for _, v := range file.Listing.Items {
|
|
result.Items = append(result.Items, &filesApi.Items{
|
|
Path: v.Path,
|
|
Name: v.Name,
|
|
Size: v.Size,
|
|
Extension: v.Extension,
|
|
Mode: v.Mode.String(),
|
|
IsDir: v.IsDir,
|
|
IsSymlink: v.IsSymlink,
|
|
Type: v.Type,
|
|
})
|
|
}
|
|
return result, err
|
|
}
|
|
|
|
func (f *FilesProvider) Create(ctx context.Context, req *filesApi.CreateReq) (*filesApi.CreateResp, error) {
|
|
fs := getFs(req.UserSpacePath)
|
|
return new(filesApi.CreateResp), fs.MkdirAll(req.Path, files.PermDir)
|
|
}
|
|
|
|
func (f *FilesProvider) Delete(ctx context.Context, req *filesApi.DeleteReq) (*filesApi.DeleteResp, error) {
|
|
fs := getFs(req.UserSpacePath)
|
|
return new(filesApi.DeleteResp), fs.RemoveAll(req.Path)
|
|
}
|
|
|
|
func (f *FilesProvider) Upload(ctx context.Context, req *filesApi.UploadReq) (*filesApi.UploadResp, error) {
|
|
fs := getFs(req.UserSpacePath)
|
|
fi, err := fs.Create(req.Path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
_, err = fi.Write(req.Content)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
fi.Close()
|
|
return new(filesApi.UploadResp), nil
|
|
}
|
|
|
|
func (f *FilesProvider) Search(ctx context.Context, req *filesApi.SearchReq) (*filesApi.SearchResp, error) {
|
|
fs := getFs(req.UserSpacePath)
|
|
result := new(filesApi.SearchResp)
|
|
err := search.Search(fs, req.Path, req.Query, rules.EmptyChecker, func(path string, f os.FileInfo) error {
|
|
result.Items = append(result.Items, &filesApi.SearchResp_Nested{
|
|
Dir: f.IsDir(),
|
|
Path: path,
|
|
})
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func getFs(UserSpacePath string) afero.Fs {
|
|
bashAbs, _ := filepath.Abs(BASE_PATH)
|
|
if !strings.HasPrefix(UserSpacePath, "/") {
|
|
UserSpacePath = "/" + UserSpacePath
|
|
}
|
|
return afero.NewBasePathFs(afero.NewOsFs(), bashAbs+UserSpacePath)
|
|
}
|